kicad-sch-api 0.4.0__py3-none-any.whl → 0.4.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of kicad-sch-api might be problematic. Click here for more details.
- kicad_sch_api/__init__.py +2 -2
- kicad_sch_api/cli/__init__.py +45 -0
- kicad_sch_api/cli/base.py +302 -0
- kicad_sch_api/cli/bom.py +164 -0
- kicad_sch_api/cli/erc.py +229 -0
- kicad_sch_api/cli/export_docs.py +289 -0
- kicad_sch_api/cli/netlist.py +94 -0
- kicad_sch_api/cli/types.py +43 -0
- kicad_sch_api/core/collections/__init__.py +5 -0
- kicad_sch_api/core/collections/base.py +248 -0
- kicad_sch_api/core/component_bounds.py +5 -0
- kicad_sch_api/core/components.py +142 -47
- kicad_sch_api/core/config.py +85 -3
- kicad_sch_api/core/factories/__init__.py +5 -0
- kicad_sch_api/core/factories/element_factory.py +276 -0
- kicad_sch_api/core/formatter.py +22 -5
- kicad_sch_api/core/junctions.py +26 -75
- kicad_sch_api/core/labels.py +28 -52
- kicad_sch_api/core/managers/file_io.py +3 -2
- kicad_sch_api/core/managers/metadata.py +6 -5
- kicad_sch_api/core/managers/validation.py +3 -2
- kicad_sch_api/core/managers/wire.py +7 -1
- kicad_sch_api/core/nets.py +38 -43
- kicad_sch_api/core/no_connects.py +29 -53
- kicad_sch_api/core/parser.py +75 -1765
- kicad_sch_api/core/schematic.py +211 -148
- kicad_sch_api/core/texts.py +28 -55
- kicad_sch_api/core/types.py +59 -18
- kicad_sch_api/core/wires.py +27 -75
- kicad_sch_api/parsers/elements/__init__.py +22 -0
- kicad_sch_api/parsers/elements/graphics_parser.py +564 -0
- kicad_sch_api/parsers/elements/label_parser.py +194 -0
- kicad_sch_api/parsers/elements/library_parser.py +165 -0
- kicad_sch_api/parsers/elements/metadata_parser.py +58 -0
- kicad_sch_api/parsers/elements/sheet_parser.py +352 -0
- kicad_sch_api/parsers/elements/symbol_parser.py +313 -0
- kicad_sch_api/parsers/elements/text_parser.py +250 -0
- kicad_sch_api/parsers/elements/wire_parser.py +242 -0
- kicad_sch_api/parsers/utils.py +80 -0
- kicad_sch_api/validation/__init__.py +25 -0
- kicad_sch_api/validation/erc.py +171 -0
- kicad_sch_api/validation/erc_models.py +203 -0
- kicad_sch_api/validation/pin_matrix.py +243 -0
- kicad_sch_api/validation/validators.py +391 -0
- {kicad_sch_api-0.4.0.dist-info → kicad_sch_api-0.4.2.dist-info}/METADATA +17 -9
- kicad_sch_api-0.4.2.dist-info/RECORD +87 -0
- kicad_sch_api/core/manhattan_routing.py +0 -430
- kicad_sch_api/core/simple_manhattan.py +0 -228
- kicad_sch_api/core/wire_routing.py +0 -380
- kicad_sch_api/parsers/label_parser.py +0 -254
- kicad_sch_api/parsers/symbol_parser.py +0 -222
- kicad_sch_api/parsers/wire_parser.py +0 -99
- kicad_sch_api-0.4.0.dist-info/RECORD +0 -67
- {kicad_sch_api-0.4.0.dist-info → kicad_sch_api-0.4.2.dist-info}/WHEEL +0 -0
- {kicad_sch_api-0.4.0.dist-info → kicad_sch_api-0.4.2.dist-info}/entry_points.txt +0 -0
- {kicad_sch_api-0.4.0.dist-info → kicad_sch_api-0.4.2.dist-info}/licenses/LICENSE +0 -0
- {kicad_sch_api-0.4.0.dist-info → kicad_sch_api-0.4.2.dist-info}/top_level.txt +0 -0
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Symbol element parser for S-expression symbol definitions.
|
|
3
|
-
|
|
4
|
-
Handles parsing of symbol elements with properties, positions, and library references.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import logging
|
|
8
|
-
from typing import Any, Dict, List, Optional
|
|
9
|
-
|
|
10
|
-
import sexpdata
|
|
11
|
-
|
|
12
|
-
from .base import BaseElementParser
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class SymbolParser(BaseElementParser):
|
|
18
|
-
"""Parser for symbol S-expression elements."""
|
|
19
|
-
|
|
20
|
-
def __init__(self):
|
|
21
|
-
"""Initialize symbol parser."""
|
|
22
|
-
super().__init__("symbol")
|
|
23
|
-
|
|
24
|
-
def parse_element(self, element: List[Any]) -> Optional[Dict[str, Any]]:
|
|
25
|
-
"""
|
|
26
|
-
Parse a symbol S-expression element.
|
|
27
|
-
|
|
28
|
-
Expected format:
|
|
29
|
-
(symbol (lib_id "Device:R") (at x y angle) (property "Reference" "R1" ...)...)
|
|
30
|
-
|
|
31
|
-
Args:
|
|
32
|
-
element: Symbol S-expression element
|
|
33
|
-
|
|
34
|
-
Returns:
|
|
35
|
-
Parsed symbol data with library ID, position, and properties
|
|
36
|
-
"""
|
|
37
|
-
symbol_data = {
|
|
38
|
-
"lib_id": "",
|
|
39
|
-
"position": {"x": 0, "y": 0, "angle": 0},
|
|
40
|
-
"mirror": "",
|
|
41
|
-
"unit": 1,
|
|
42
|
-
"in_bom": True,
|
|
43
|
-
"on_board": True,
|
|
44
|
-
"fields_autoplaced": False,
|
|
45
|
-
"uuid": None,
|
|
46
|
-
"properties": [],
|
|
47
|
-
"instances": [],
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
for elem in element[1:]:
|
|
51
|
-
if not isinstance(elem, list):
|
|
52
|
-
continue
|
|
53
|
-
|
|
54
|
-
elem_type = str(elem[0]) if isinstance(elem[0], sexpdata.Symbol) else None
|
|
55
|
-
|
|
56
|
-
if elem_type == "lib_id":
|
|
57
|
-
symbol_data["lib_id"] = str(elem[1]) if len(elem) > 1 else ""
|
|
58
|
-
elif elem_type == "at":
|
|
59
|
-
self._parse_position(elem, symbol_data)
|
|
60
|
-
elif elem_type == "mirror":
|
|
61
|
-
symbol_data["mirror"] = str(elem[1]) if len(elem) > 1 else ""
|
|
62
|
-
elif elem_type == "unit":
|
|
63
|
-
symbol_data["unit"] = int(elem[1]) if len(elem) > 1 else 1
|
|
64
|
-
elif elem_type == "in_bom":
|
|
65
|
-
symbol_data["in_bom"] = self._parse_boolean(elem[1]) if len(elem) > 1 else True
|
|
66
|
-
elif elem_type == "on_board":
|
|
67
|
-
symbol_data["on_board"] = self._parse_boolean(elem[1]) if len(elem) > 1 else True
|
|
68
|
-
elif elem_type == "fields_autoplaced":
|
|
69
|
-
symbol_data["fields_autoplaced"] = True
|
|
70
|
-
elif elem_type == "uuid":
|
|
71
|
-
symbol_data["uuid"] = str(elem[1]) if len(elem) > 1 else None
|
|
72
|
-
elif elem_type == "property":
|
|
73
|
-
prop = self._parse_property(elem)
|
|
74
|
-
if prop:
|
|
75
|
-
symbol_data["properties"].append(prop)
|
|
76
|
-
elif elem_type == "instances":
|
|
77
|
-
symbol_data["instances"] = self._parse_instances(elem)
|
|
78
|
-
|
|
79
|
-
return symbol_data
|
|
80
|
-
|
|
81
|
-
def _parse_position(self, at_element: List[Any], symbol_data: Dict[str, Any]) -> None:
|
|
82
|
-
"""
|
|
83
|
-
Parse position from at element.
|
|
84
|
-
|
|
85
|
-
Args:
|
|
86
|
-
at_element: (at x y [angle])
|
|
87
|
-
symbol_data: Symbol data dictionary to update
|
|
88
|
-
"""
|
|
89
|
-
try:
|
|
90
|
-
if len(at_element) >= 3:
|
|
91
|
-
symbol_data["position"]["x"] = float(at_element[1])
|
|
92
|
-
symbol_data["position"]["y"] = float(at_element[2])
|
|
93
|
-
if len(at_element) >= 4:
|
|
94
|
-
symbol_data["position"]["angle"] = float(at_element[3])
|
|
95
|
-
except (ValueError, IndexError) as e:
|
|
96
|
-
self._logger.warning(f"Invalid position coordinates: {at_element}, error: {e}")
|
|
97
|
-
|
|
98
|
-
def _parse_property(self, prop_element: List[Any]) -> Optional[Dict[str, Any]]:
|
|
99
|
-
"""
|
|
100
|
-
Parse a property element.
|
|
101
|
-
|
|
102
|
-
Args:
|
|
103
|
-
prop_element: (property "name" "value" (at x y angle) ...)
|
|
104
|
-
|
|
105
|
-
Returns:
|
|
106
|
-
Parsed property data or None if invalid
|
|
107
|
-
"""
|
|
108
|
-
if len(prop_element) < 3:
|
|
109
|
-
return None
|
|
110
|
-
|
|
111
|
-
prop_data = {
|
|
112
|
-
"name": str(prop_element[1]),
|
|
113
|
-
"value": str(prop_element[2]),
|
|
114
|
-
"position": {"x": 0, "y": 0, "angle": 0},
|
|
115
|
-
"effects": {},
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
# Parse additional property elements
|
|
119
|
-
for elem in prop_element[3:]:
|
|
120
|
-
if isinstance(elem, list) and len(elem) > 0:
|
|
121
|
-
elem_type = str(elem[0])
|
|
122
|
-
if elem_type == "at":
|
|
123
|
-
self._parse_property_position(elem, prop_data)
|
|
124
|
-
elif elem_type == "effects":
|
|
125
|
-
prop_data["effects"] = self._parse_effects(elem)
|
|
126
|
-
|
|
127
|
-
return prop_data
|
|
128
|
-
|
|
129
|
-
def _parse_property_position(self, at_element: List[Any], prop_data: Dict[str, Any]) -> None:
|
|
130
|
-
"""Parse property position from at element."""
|
|
131
|
-
try:
|
|
132
|
-
if len(at_element) >= 3:
|
|
133
|
-
prop_data["position"]["x"] = float(at_element[1])
|
|
134
|
-
prop_data["position"]["y"] = float(at_element[2])
|
|
135
|
-
if len(at_element) >= 4:
|
|
136
|
-
prop_data["position"]["angle"] = float(at_element[3])
|
|
137
|
-
except (ValueError, IndexError) as e:
|
|
138
|
-
self._logger.warning(f"Invalid property position: {at_element}, error: {e}")
|
|
139
|
-
|
|
140
|
-
def _parse_effects(self, effects_element: List[Any]) -> Dict[str, Any]:
|
|
141
|
-
"""Parse effects element for text formatting."""
|
|
142
|
-
effects = {
|
|
143
|
-
"font_size": 1.27,
|
|
144
|
-
"font_thickness": 0.15,
|
|
145
|
-
"bold": False,
|
|
146
|
-
"italic": False,
|
|
147
|
-
"hide": False,
|
|
148
|
-
"justify": [],
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
for elem in effects_element[1:]:
|
|
152
|
-
if isinstance(elem, list) and len(elem) > 0:
|
|
153
|
-
elem_type = str(elem[0])
|
|
154
|
-
if elem_type == "font":
|
|
155
|
-
self._parse_font(elem, effects)
|
|
156
|
-
elif elem_type == "justify":
|
|
157
|
-
effects["justify"] = [str(j) for j in elem[1:]]
|
|
158
|
-
elif elem_type == "hide":
|
|
159
|
-
effects["hide"] = True
|
|
160
|
-
|
|
161
|
-
return effects
|
|
162
|
-
|
|
163
|
-
def _parse_font(self, font_element: List[Any], effects: Dict[str, Any]) -> None:
|
|
164
|
-
"""Parse font element within effects."""
|
|
165
|
-
for elem in font_element[1:]:
|
|
166
|
-
if isinstance(elem, list) and len(elem) > 0:
|
|
167
|
-
elem_type = str(elem[0])
|
|
168
|
-
if elem_type == "size":
|
|
169
|
-
try:
|
|
170
|
-
if len(elem) >= 3:
|
|
171
|
-
effects["font_size"] = float(elem[1])
|
|
172
|
-
except (ValueError, IndexError):
|
|
173
|
-
pass
|
|
174
|
-
elif elem_type == "thickness":
|
|
175
|
-
try:
|
|
176
|
-
effects["font_thickness"] = float(elem[1])
|
|
177
|
-
except (ValueError, IndexError):
|
|
178
|
-
pass
|
|
179
|
-
elif elem_type == "bold":
|
|
180
|
-
effects["bold"] = True
|
|
181
|
-
elif elem_type == "italic":
|
|
182
|
-
effects["italic"] = True
|
|
183
|
-
|
|
184
|
-
def _parse_instances(self, instances_element: List[Any]) -> List[Dict[str, Any]]:
|
|
185
|
-
"""Parse instances element for symbol instances."""
|
|
186
|
-
instances = []
|
|
187
|
-
for elem in instances_element[1:]:
|
|
188
|
-
if isinstance(elem, list) and len(elem) > 0 and str(elem[0]) == "instance":
|
|
189
|
-
instance = self._parse_instance(elem)
|
|
190
|
-
if instance:
|
|
191
|
-
instances.append(instance)
|
|
192
|
-
return instances
|
|
193
|
-
|
|
194
|
-
def _parse_instance(self, instance_element: List[Any]) -> Optional[Dict[str, Any]]:
|
|
195
|
-
"""Parse a single instance element."""
|
|
196
|
-
instance = {"project": "", "path": "", "reference": "", "unit": 1}
|
|
197
|
-
|
|
198
|
-
for elem in instance_element[1:]:
|
|
199
|
-
if isinstance(elem, list) and len(elem) >= 2:
|
|
200
|
-
elem_type = str(elem[0])
|
|
201
|
-
if elem_type == "project":
|
|
202
|
-
instance["project"] = str(elem[1])
|
|
203
|
-
elif elem_type == "path":
|
|
204
|
-
instance["path"] = str(elem[1])
|
|
205
|
-
elif elem_type == "reference":
|
|
206
|
-
instance["reference"] = str(elem[1])
|
|
207
|
-
elif elem_type == "unit":
|
|
208
|
-
try:
|
|
209
|
-
instance["unit"] = int(elem[1])
|
|
210
|
-
except (ValueError, IndexError):
|
|
211
|
-
pass
|
|
212
|
-
|
|
213
|
-
return instance if instance["reference"] else None
|
|
214
|
-
|
|
215
|
-
def _parse_boolean(self, value: Any) -> bool:
|
|
216
|
-
"""Parse boolean value from S-expression."""
|
|
217
|
-
if isinstance(value, str):
|
|
218
|
-
return value.lower() in ("yes", "true", "1")
|
|
219
|
-
elif isinstance(value, sexpdata.Symbol):
|
|
220
|
-
return str(value).lower() in ("yes", "true", "1")
|
|
221
|
-
else:
|
|
222
|
-
return bool(value)
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Wire element parser for S-expression wire definitions.
|
|
3
|
-
|
|
4
|
-
Handles parsing of wire elements with points, stroke properties, and UUIDs.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import logging
|
|
8
|
-
from typing import Any, Dict, List, Optional
|
|
9
|
-
|
|
10
|
-
import sexpdata
|
|
11
|
-
|
|
12
|
-
from .base import BaseElementParser
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class WireParser(BaseElementParser):
|
|
18
|
-
"""Parser for wire S-expression elements."""
|
|
19
|
-
|
|
20
|
-
def __init__(self):
|
|
21
|
-
"""Initialize wire parser."""
|
|
22
|
-
super().__init__("wire")
|
|
23
|
-
|
|
24
|
-
def parse_element(self, element: List[Any]) -> Optional[Dict[str, Any]]:
|
|
25
|
-
"""
|
|
26
|
-
Parse a wire S-expression element.
|
|
27
|
-
|
|
28
|
-
Expected format:
|
|
29
|
-
(wire (pts (xy x1 y1) (xy x2 y2) ...) (stroke (width w) (type t)) (uuid "..."))
|
|
30
|
-
|
|
31
|
-
Args:
|
|
32
|
-
element: Wire S-expression element
|
|
33
|
-
|
|
34
|
-
Returns:
|
|
35
|
-
Parsed wire data with points, stroke, and UUID information
|
|
36
|
-
"""
|
|
37
|
-
wire_data = {
|
|
38
|
-
"points": [],
|
|
39
|
-
"stroke_width": 0.0,
|
|
40
|
-
"stroke_type": "default",
|
|
41
|
-
"uuid": None,
|
|
42
|
-
"wire_type": "wire", # Default to wire (vs bus)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
for elem in element[1:]:
|
|
46
|
-
if not isinstance(elem, list):
|
|
47
|
-
continue
|
|
48
|
-
|
|
49
|
-
elem_type = str(elem[0]) if isinstance(elem[0], sexpdata.Symbol) else None
|
|
50
|
-
|
|
51
|
-
if elem_type == "pts":
|
|
52
|
-
self._parse_points(elem, wire_data)
|
|
53
|
-
elif elem_type == "stroke":
|
|
54
|
-
self._parse_stroke(elem, wire_data)
|
|
55
|
-
elif elem_type == "uuid":
|
|
56
|
-
wire_data["uuid"] = str(elem[1]) if len(elem) > 1 else None
|
|
57
|
-
|
|
58
|
-
# Validate wire has sufficient points
|
|
59
|
-
if len(wire_data["points"]) >= 2:
|
|
60
|
-
return wire_data
|
|
61
|
-
else:
|
|
62
|
-
self._logger.warning(f"Wire has insufficient points: {len(wire_data['points'])}")
|
|
63
|
-
return None
|
|
64
|
-
|
|
65
|
-
def _parse_points(self, pts_element: List[Any], wire_data: Dict[str, Any]) -> None:
|
|
66
|
-
"""
|
|
67
|
-
Parse points from pts element.
|
|
68
|
-
|
|
69
|
-
Args:
|
|
70
|
-
pts_element: (pts (xy x1 y1) (xy x2 y2) ...)
|
|
71
|
-
wire_data: Wire data dictionary to update
|
|
72
|
-
"""
|
|
73
|
-
for pt in pts_element[1:]:
|
|
74
|
-
if isinstance(pt, list) and len(pt) >= 3:
|
|
75
|
-
if str(pt[0]) == "xy":
|
|
76
|
-
try:
|
|
77
|
-
x, y = float(pt[1]), float(pt[2])
|
|
78
|
-
wire_data["points"].append({"x": x, "y": y})
|
|
79
|
-
except (ValueError, IndexError) as e:
|
|
80
|
-
self._logger.warning(f"Invalid point coordinates: {pt}, error: {e}")
|
|
81
|
-
|
|
82
|
-
def _parse_stroke(self, stroke_element: List[Any], wire_data: Dict[str, Any]) -> None:
|
|
83
|
-
"""
|
|
84
|
-
Parse stroke properties from stroke element.
|
|
85
|
-
|
|
86
|
-
Args:
|
|
87
|
-
stroke_element: (stroke (width w) (type t))
|
|
88
|
-
wire_data: Wire data dictionary to update
|
|
89
|
-
"""
|
|
90
|
-
for stroke_elem in stroke_element[1:]:
|
|
91
|
-
if isinstance(stroke_elem, list) and len(stroke_elem) >= 2:
|
|
92
|
-
stroke_type = str(stroke_elem[0])
|
|
93
|
-
try:
|
|
94
|
-
if stroke_type == "width":
|
|
95
|
-
wire_data["stroke_width"] = float(stroke_elem[1])
|
|
96
|
-
elif stroke_type == "type":
|
|
97
|
-
wire_data["stroke_type"] = str(stroke_elem[1])
|
|
98
|
-
except (ValueError, IndexError) as e:
|
|
99
|
-
self._logger.warning(f"Invalid stroke property: {stroke_elem}, error: {e}")
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
kicad_sch_api/__init__.py,sha256=87qLx-VMQTBHDVq_CiXW-6wyKtvLFc3AsKQaoLKsIbs,2919
|
|
2
|
-
kicad_sch_api/cli.py,sha256=ZzmwzfHEvPgGfCiQBU4G2LBAyRtMNiBRoY21pivJSYc,7621
|
|
3
|
-
kicad_sch_api/py.typed,sha256=e4ldqxwpY7pNDG1olbvj4HSKr8sZ9vxgA_2ek8xXn-Q,70
|
|
4
|
-
kicad_sch_api/collections/__init__.py,sha256=I3DSWk0XmGE8J1fcTtiYOETaWrY-fFJPlz3UGUK2qXY,627
|
|
5
|
-
kicad_sch_api/collections/base.py,sha256=7p-WVLg-2_uBS7z7mzwkOpCMwlR_VJZGr2iW_Hd1K3Q,8386
|
|
6
|
-
kicad_sch_api/collections/components.py,sha256=ofH3P38Ube3uxVvk_28gJwJPsdL6KA37rgxWNig6BGM,14023
|
|
7
|
-
kicad_sch_api/collections/junctions.py,sha256=4bjuUKm-tCWSJJTtuPwgjYh0Xglg2SEG8IOAvhULgtg,11728
|
|
8
|
-
kicad_sch_api/collections/labels.py,sha256=zg6_xe4ifwIbc8M1E5MDGTh8Ps57oBeqbS9MclrvxKU,12266
|
|
9
|
-
kicad_sch_api/collections/wires.py,sha256=o2Y_KIwOmFMytdOc2MjgnoUrK4Woj7wR9ROj4uRTuY0,12394
|
|
10
|
-
kicad_sch_api/core/__init__.py,sha256=ur_KeYBlGKl-e1hLpLdxAhGV2A-PCCGkcqd0r6KSeBA,566
|
|
11
|
-
kicad_sch_api/core/component_bounds.py,sha256=BFYJYULyzs5it2hN7bHTimyS9Vet4dxsMklRStob-F4,17509
|
|
12
|
-
kicad_sch_api/core/components.py,sha256=ilwZfrWUXQjtT3yB3yxT-H0X64izU3aXP6TdPZdki2k,25393
|
|
13
|
-
kicad_sch_api/core/config.py,sha256=itw0j3DeIEHaFVf8p3mfAS1SP6jclBwvMv7NPdkThE4,4309
|
|
14
|
-
kicad_sch_api/core/formatter.py,sha256=RGN1Y1Ne5uBhKU4XRINVBb0ph6pm5Khycdv352r3cDw,22207
|
|
15
|
-
kicad_sch_api/core/geometry.py,sha256=27SgN0padLbQuTi8MV6UUCp6Pyaiv8V9gmYDOhfwny8,2947
|
|
16
|
-
kicad_sch_api/core/ic_manager.py,sha256=Kg0HIOMU-TGXiIkrnwcHFQ1Kfv_3rW2U1cwBKJsKopc,7219
|
|
17
|
-
kicad_sch_api/core/junctions.py,sha256=Ay6BsWX_DLs-wB0eMA2CytKKq0N8Ja41ZubJWpAqNgM,6122
|
|
18
|
-
kicad_sch_api/core/labels.py,sha256=hkqZVd7wudl1-uil9jHt4k3vy1ZSX5JAyTFXktGauLo,11094
|
|
19
|
-
kicad_sch_api/core/manhattan_routing.py,sha256=t_T2u0zsQB-a8dTijFmY-qFq-oDt2qDebYyXzD_pBWI,15989
|
|
20
|
-
kicad_sch_api/core/nets.py,sha256=9bO8A1dzSuJ8aZ26-PHbUiWi9KYx6LqoXQHEKTCR7VA,9588
|
|
21
|
-
kicad_sch_api/core/no_connects.py,sha256=LM__SeeK-0YPOLjkh1RXlBbaKnqehhbox7A8F6cUq0o,9426
|
|
22
|
-
kicad_sch_api/core/parser.py,sha256=K3Dh5J3YswlXNakbR0FVcTPpuW4VK6Yg2e1a-yxH0xI,96227
|
|
23
|
-
kicad_sch_api/core/pin_utils.py,sha256=XGEow3HzBTyT8a0B_ZC8foMvwzYaENSaqTUwDW1rz24,5417
|
|
24
|
-
kicad_sch_api/core/schematic.py,sha256=OXOlC7GDfYFc1FlYHIUnHHp19DbzhRWBnNJjlma2NAk,56063
|
|
25
|
-
kicad_sch_api/core/simple_manhattan.py,sha256=CvIHvwmfABPF-COzhblYxEgRoR_R_eD-lmBFHHjDuMI,7241
|
|
26
|
-
kicad_sch_api/core/texts.py,sha256=el_9pr9VN-8v7miSG0HvOVsGEsMrkXNKpzJIRNxZmQ0,10727
|
|
27
|
-
kicad_sch_api/core/types.py,sha256=tieyn5-L_hW6EnKR-bLVB_jtXV6NCNb0SbdYE2srW4s,14140
|
|
28
|
-
kicad_sch_api/core/wire_routing.py,sha256=G-C7S-ntQxwuu1z3OaaYlkURXwKE4r4xmhbbi6cvvaI,12830
|
|
29
|
-
kicad_sch_api/core/wires.py,sha256=608t9oH4UzppdGgNgUd-ABK6T-ahyETZwhO_-CuKFO8,8319
|
|
30
|
-
kicad_sch_api/core/managers/__init__.py,sha256=Ec9H9RSBFt2MeJIhnZFUN9sa2ql0BSrO8FNOa1XsXeU,731
|
|
31
|
-
kicad_sch_api/core/managers/file_io.py,sha256=dHHoi0BhIdpWmrpMQ0tdZJpbNd7dseytnY3UO-p5xWY,7605
|
|
32
|
-
kicad_sch_api/core/managers/format_sync.py,sha256=ar0FfhwXrU2l5ATV0aW5KtVRfIM2iM1WoyGvXQh-ShY,16963
|
|
33
|
-
kicad_sch_api/core/managers/graphics.py,sha256=-jd-JL1TOuDntNEQcSeJ56Ccrkuudmj1dJkRtLUtRog,18370
|
|
34
|
-
kicad_sch_api/core/managers/metadata.py,sha256=Mjv-YjdaWRq-XlDZNlqgcWTyE1v8H7yLUXGWc9f9g7Q,8058
|
|
35
|
-
kicad_sch_api/core/managers/sheet.py,sha256=jnnEBon0QmMh22-Ls7ZP5A_4FxM7bCyaJOF9AzZT1Kg,14816
|
|
36
|
-
kicad_sch_api/core/managers/text_elements.py,sha256=utZIg488x9NLQID6ALbOcI0ZM2PfvgADVJ1jcbGP9jk,17319
|
|
37
|
-
kicad_sch_api/core/managers/validation.py,sha256=Rz6e1m14Qxw1Izbqm7fAGySFOimfx9m5BWdnuomueg8,15792
|
|
38
|
-
kicad_sch_api/core/managers/wire.py,sha256=Uvrqnacl0SjEfLmBwHVoyq0KXTM5lz7TRPdIffmKaG4,11596
|
|
39
|
-
kicad_sch_api/discovery/__init__.py,sha256=qSuCsnC-hVtaLYE8fwd-Gea6JKwEVGPQ-hSNDNJYsIU,329
|
|
40
|
-
kicad_sch_api/discovery/search_index.py,sha256=KgQT8ipT9OU6ktUwhDZ37Mao0Cba0fJOsxUk9m8ZKbY,15856
|
|
41
|
-
kicad_sch_api/geometry/__init__.py,sha256=hTBXkn8mZZCjzDIrtPv67QsnCYB77L67JjthQgEIX7o,716
|
|
42
|
-
kicad_sch_api/geometry/font_metrics.py,sha256=3f5_9ifxtDUigLDiafglO2pCgPE7JFDKqa-0uhLPkoQ,839
|
|
43
|
-
kicad_sch_api/geometry/symbol_bbox.py,sha256=3zd9-M9ehue5_-Gpdm_Yht4W49CbE0YRsAhAzfqJGEg,24161
|
|
44
|
-
kicad_sch_api/interfaces/__init__.py,sha256=ukuLgCT16e0sPLmrGb4HB_3DhGU1YriDEkeRgEBsQIA,435
|
|
45
|
-
kicad_sch_api/interfaces/parser.py,sha256=J-b0czz1q_O81HlvIp3dHx53cm8UGSgQTd4xe5tBszk,2008
|
|
46
|
-
kicad_sch_api/interfaces/repository.py,sha256=wFnWUCut6wPV9yDDE9k6zkhhijRnflbLteeXYtcU-gM,1763
|
|
47
|
-
kicad_sch_api/interfaces/resolver.py,sha256=2_3et6VVnyZZ8VI5i-Q4C-4bBXKTAgYAEFxAFuOWEGw,2936
|
|
48
|
-
kicad_sch_api/library/__init__.py,sha256=NG9UTdcpn25Bl9tPsYs9ED7bvpaVPVdtLMbnxkQkOnU,250
|
|
49
|
-
kicad_sch_api/library/cache.py,sha256=7na88grl465WHwUOGuOzYrrWwjsMBXhXVtxhnaJ9GBY,33208
|
|
50
|
-
kicad_sch_api/parsers/__init__.py,sha256=4TFc2duJMy6iRuk2dYbW4b7s-9H525iAsGU674_2a-E,357
|
|
51
|
-
kicad_sch_api/parsers/base.py,sha256=vsKGxZkdzTNqrdbRPx11D4b3ebDm3LW65v2Xf4Q06_c,4569
|
|
52
|
-
kicad_sch_api/parsers/label_parser.py,sha256=E9A2FY_BBZtFRxoT7g0Pg09J0J87nHAlMuTK4selsGQ,8692
|
|
53
|
-
kicad_sch_api/parsers/registry.py,sha256=LoPvWIiGYysvTRtFfd8kWCXE0i535hoKYpdKs49Ygjs,5098
|
|
54
|
-
kicad_sch_api/parsers/symbol_parser.py,sha256=RpTPMMOfNVHjJbXOrlJyTFWeVBH64Fq-dndG1F9Y_70,8411
|
|
55
|
-
kicad_sch_api/parsers/wire_parser.py,sha256=xHSG-baXS0ncnv3TLjLnd9poXB4rhBdHmz6q99RadX8,3420
|
|
56
|
-
kicad_sch_api/symbols/__init__.py,sha256=NfakJ5-8AQxq5vi8nZVuaUtDpWHfwHm5AD4rC-p9BZI,501
|
|
57
|
-
kicad_sch_api/symbols/cache.py,sha256=pKFjmuyId-9gGPAue-1Rzy4MRsecoC4TMn0hn2n0Yqk,16204
|
|
58
|
-
kicad_sch_api/symbols/resolver.py,sha256=w0jqepp9RwWqlwQHX28FpTn1aSz8iOf7kcJUOBMHwqE,12074
|
|
59
|
-
kicad_sch_api/symbols/validators.py,sha256=5Ryt4rLHxDF3ALViaNLRrI3pYvOreVT51gpvhECTZms,17216
|
|
60
|
-
kicad_sch_api/utils/__init__.py,sha256=1V_yGgI7jro6MUc4Pviux_WIeJ1wmiYFID186SZwWLQ,277
|
|
61
|
-
kicad_sch_api/utils/validation.py,sha256=XlWGRZJb3cOPYpU9sLQQgC_NASwbi6W-LCN7PzUmaPY,15626
|
|
62
|
-
kicad_sch_api-0.4.0.dist-info/licenses/LICENSE,sha256=Em65Nvte1G9MHc0rHqtYuGkCPcshD588itTa358J6gs,1070
|
|
63
|
-
kicad_sch_api-0.4.0.dist-info/METADATA,sha256=my1z7F-NiRJw7Kh1c99d5bh0-ohJ8CuDNTfbxylPxwI,17183
|
|
64
|
-
kicad_sch_api-0.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
65
|
-
kicad_sch_api-0.4.0.dist-info/entry_points.txt,sha256=VWKsFi2Jv7G_tmio3cNVhhIBfv_OZFaKa-T_ED84lc8,57
|
|
66
|
-
kicad_sch_api-0.4.0.dist-info/top_level.txt,sha256=n0ex4gOJ1b_fARowcGqRzyOGZcHRhc5LZa6_vVgGxcI,14
|
|
67
|
-
kicad_sch_api-0.4.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|