61a44f0a06fb293b8f141a295b6c9d5e787090a0
Stefan Schuermans 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) 
Stefan Schuermans 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) 
Stefan Schuermans 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) 
Stefan Schuermans 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)     ])
Stefan Schuermans 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) 
Stefan Schuermans 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)     ])
Stefan Schuermans 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) 
Stefan Schuermans 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)     ])
Stefan Schuermans 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([
Stefan Schuermans 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)),
Stefan Schuermans 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([
Stefan Schuermans 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)),