kicad-sch-api 0.2.1__py3-none-any.whl → 0.2.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/core/formatter.py +7 -1
- kicad_sch_api/core/parser.py +102 -11
- kicad_sch_api/core/schematic.py +53 -0
- kicad_sch_api/core/types.py +35 -0
- {kicad_sch_api-0.2.1.dist-info → kicad_sch_api-0.2.2.dist-info}/METADATA +1 -1
- {kicad_sch_api-0.2.1.dist-info → kicad_sch_api-0.2.2.dist-info}/RECORD +10 -10
- {kicad_sch_api-0.2.1.dist-info → kicad_sch_api-0.2.2.dist-info}/WHEEL +0 -0
- {kicad_sch_api-0.2.1.dist-info → kicad_sch_api-0.2.2.dist-info}/entry_points.txt +0 -0
- {kicad_sch_api-0.2.1.dist-info → kicad_sch_api-0.2.2.dist-info}/licenses/LICENSE +0 -0
- {kicad_sch_api-0.2.1.dist-info → kicad_sch_api-0.2.2.dist-info}/top_level.txt +0 -0
kicad_sch_api/core/formatter.py
CHANGED
|
@@ -55,7 +55,7 @@ class ExactFormatter:
|
|
|
55
55
|
self.rules["generator"] = FormatRule(inline=True, quote_indices={1})
|
|
56
56
|
self.rules["generator_version"] = FormatRule(inline=True, quote_indices={1})
|
|
57
57
|
self.rules["uuid"] = FormatRule(inline=True, quote_indices={1})
|
|
58
|
-
self.rules["paper"] = FormatRule(inline=True,
|
|
58
|
+
self.rules["paper"] = FormatRule(inline=True) # No quotes for paper size (A4, A3, etc.)
|
|
59
59
|
|
|
60
60
|
# Title block
|
|
61
61
|
self.rules["title_block"] = FormatRule(inline=False)
|
|
@@ -112,6 +112,12 @@ class ExactFormatter:
|
|
|
112
112
|
self.rules["junction"] = FormatRule(inline=False)
|
|
113
113
|
self.rules["diameter"] = FormatRule(inline=True)
|
|
114
114
|
|
|
115
|
+
# Graphical elements
|
|
116
|
+
self.rules["rectangle"] = FormatRule(inline=False)
|
|
117
|
+
self.rules["start"] = FormatRule(inline=True)
|
|
118
|
+
self.rules["end"] = FormatRule(inline=True)
|
|
119
|
+
self.rules["fill"] = FormatRule(inline=False)
|
|
120
|
+
|
|
115
121
|
# Labels
|
|
116
122
|
self.rules["label"] = FormatRule(inline=False, quote_indices={1})
|
|
117
123
|
self.rules["global_label"] = FormatRule(inline=False, quote_indices={1})
|
kicad_sch_api/core/parser.py
CHANGED
|
@@ -187,6 +187,7 @@ class SExpressionParser:
|
|
|
187
187
|
"wires": [],
|
|
188
188
|
"junctions": [],
|
|
189
189
|
"labels": [],
|
|
190
|
+
"rectangles": [],
|
|
190
191
|
"nets": [],
|
|
191
192
|
"lib_symbols": {},
|
|
192
193
|
"sheet_instances": [],
|
|
@@ -232,6 +233,10 @@ class SExpressionParser:
|
|
|
232
233
|
label = self._parse_label(item)
|
|
233
234
|
if label:
|
|
234
235
|
schematic_data["labels"].append(label)
|
|
236
|
+
elif element_type == "rectangle":
|
|
237
|
+
rectangle = self._parse_rectangle(item)
|
|
238
|
+
if rectangle:
|
|
239
|
+
schematic_data["rectangles"].append(rectangle)
|
|
235
240
|
elif element_type == "lib_symbols":
|
|
236
241
|
schematic_data["lib_symbols"] = self._parse_lib_symbols(item)
|
|
237
242
|
elif element_type == "sheet_instances":
|
|
@@ -304,10 +309,14 @@ class SExpressionParser:
|
|
|
304
309
|
for text_box in schematic_data.get("text_boxes", []):
|
|
305
310
|
sexp_data.append(self._text_box_to_sexp(text_box))
|
|
306
311
|
|
|
307
|
-
# Add graphics (rectangles
|
|
312
|
+
# Add graphics (rectangles from schematic.draw_bounding_box)
|
|
308
313
|
for graphic in schematic_data.get("graphics", []):
|
|
309
314
|
sexp_data.append(self._graphic_to_sexp(graphic))
|
|
310
315
|
|
|
316
|
+
# Add rectangles (rectangles from add_rectangle API)
|
|
317
|
+
for rectangle in schematic_data.get("rectangles", []):
|
|
318
|
+
sexp_data.append(self._rectangle_to_sexp(rectangle))
|
|
319
|
+
|
|
311
320
|
# Add sheet_instances (required by KiCAD)
|
|
312
321
|
sheet_instances = schematic_data.get("sheet_instances", [])
|
|
313
322
|
if sheet_instances:
|
|
@@ -425,6 +434,37 @@ class SExpressionParser:
|
|
|
425
434
|
# Implementation for label parsing
|
|
426
435
|
return {}
|
|
427
436
|
|
|
437
|
+
def _parse_rectangle(self, item: List[Any]) -> Optional[Dict[str, Any]]:
|
|
438
|
+
"""Parse a rectangle graphical element."""
|
|
439
|
+
rectangle = {}
|
|
440
|
+
|
|
441
|
+
for elem in item[1:]:
|
|
442
|
+
if not isinstance(elem, list):
|
|
443
|
+
continue
|
|
444
|
+
|
|
445
|
+
elem_type = str(elem[0])
|
|
446
|
+
|
|
447
|
+
if elem_type == "start" and len(elem) >= 3:
|
|
448
|
+
rectangle["start"] = {"x": float(elem[1]), "y": float(elem[2])}
|
|
449
|
+
elif elem_type == "end" and len(elem) >= 3:
|
|
450
|
+
rectangle["end"] = {"x": float(elem[1]), "y": float(elem[2])}
|
|
451
|
+
elif elem_type == "stroke":
|
|
452
|
+
for stroke_elem in elem[1:]:
|
|
453
|
+
if isinstance(stroke_elem, list):
|
|
454
|
+
stroke_type = str(stroke_elem[0])
|
|
455
|
+
if stroke_type == "width" and len(stroke_elem) >= 2:
|
|
456
|
+
rectangle["stroke_width"] = float(stroke_elem[1])
|
|
457
|
+
elif stroke_type == "type" and len(stroke_elem) >= 2:
|
|
458
|
+
rectangle["stroke_type"] = str(stroke_elem[1])
|
|
459
|
+
elif elem_type == "fill":
|
|
460
|
+
for fill_elem in elem[1:]:
|
|
461
|
+
if isinstance(fill_elem, list) and str(fill_elem[0]) == "type":
|
|
462
|
+
rectangle["fill_type"] = str(fill_elem[1]) if len(fill_elem) >= 2 else "none"
|
|
463
|
+
elif elem_type == "uuid" and len(elem) >= 2:
|
|
464
|
+
rectangle["uuid"] = str(elem[1])
|
|
465
|
+
|
|
466
|
+
return rectangle if rectangle else None
|
|
467
|
+
|
|
428
468
|
def _parse_lib_symbols(self, item: List[Any]) -> Dict[str, Any]:
|
|
429
469
|
"""Parse lib_symbols section."""
|
|
430
470
|
# Implementation for lib_symbols parsing
|
|
@@ -529,14 +569,28 @@ class SExpressionParser:
|
|
|
529
569
|
# Add instances section (required by KiCAD)
|
|
530
570
|
from .config import config
|
|
531
571
|
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
572
|
+
# Get project name from config or properties
|
|
573
|
+
project_name = symbol_data.get("properties", {}).get("project_name")
|
|
574
|
+
if not project_name:
|
|
575
|
+
project_name = getattr(self, "project_name", config.defaults.project_name)
|
|
576
|
+
|
|
577
|
+
# CRITICAL FIX: Use the FULL hierarchy_path from properties if available
|
|
578
|
+
# For hierarchical schematics, this contains the complete path: /root_uuid/sheet_symbol_uuid/...
|
|
579
|
+
# This ensures KiCad can properly annotate components in sub-sheets
|
|
580
|
+
hierarchy_path = symbol_data.get("properties", {}).get("hierarchy_path")
|
|
581
|
+
if hierarchy_path:
|
|
582
|
+
# Use the full hierarchical path (includes root + all sheet symbols)
|
|
583
|
+
instance_path = hierarchy_path
|
|
584
|
+
logger.debug(f"🔧 Using FULL hierarchy_path: {instance_path} for component {symbol_data.get('reference', 'unknown')}")
|
|
585
|
+
else:
|
|
586
|
+
# Fallback: use root_uuid or schematic_uuid for flat designs
|
|
587
|
+
root_uuid = symbol_data.get("properties", {}).get("root_uuid") or schematic_uuid or str(uuid.uuid4())
|
|
588
|
+
instance_path = f"/{root_uuid}"
|
|
589
|
+
logger.debug(f"🔧 Using root UUID path: {instance_path} for component {symbol_data.get('reference', 'unknown')}")
|
|
590
|
+
|
|
591
|
+
logger.debug(f"🔧 Component properties keys: {list(symbol_data.get('properties', {}).keys())}")
|
|
592
|
+
logger.debug(f"🔧 Using project name: '{project_name}'")
|
|
593
|
+
|
|
540
594
|
sexp.append(
|
|
541
595
|
[
|
|
542
596
|
sexpdata.Symbol("instances"),
|
|
@@ -545,7 +599,7 @@ class SExpressionParser:
|
|
|
545
599
|
project_name,
|
|
546
600
|
[
|
|
547
601
|
sexpdata.Symbol("path"),
|
|
548
|
-
|
|
602
|
+
instance_path,
|
|
549
603
|
[sexpdata.Symbol("reference"), symbol_data.get("reference", "U?")],
|
|
550
604
|
[sexpdata.Symbol("unit"), symbol_data.get("unit", 1)],
|
|
551
605
|
],
|
|
@@ -772,7 +826,10 @@ class SExpressionParser:
|
|
|
772
826
|
effects = [sexpdata.Symbol("effects")]
|
|
773
827
|
font = [sexpdata.Symbol("font"), [sexpdata.Symbol("size"), size, size]]
|
|
774
828
|
effects.append(font)
|
|
775
|
-
|
|
829
|
+
|
|
830
|
+
# Use justification from data if provided, otherwise default to "left"
|
|
831
|
+
justify = hlabel_data.get("justify", "left")
|
|
832
|
+
effects.append([sexpdata.Symbol("justify"), sexpdata.Symbol(justify)])
|
|
776
833
|
sexp.append(effects)
|
|
777
834
|
|
|
778
835
|
# Add UUID
|
|
@@ -1034,6 +1091,40 @@ class SExpressionParser:
|
|
|
1034
1091
|
|
|
1035
1092
|
return sexp
|
|
1036
1093
|
|
|
1094
|
+
def _rectangle_to_sexp(self, rectangle_data: Dict[str, Any]) -> List[Any]:
|
|
1095
|
+
"""Convert rectangle element to S-expression."""
|
|
1096
|
+
sexp = [sexpdata.Symbol("rectangle")]
|
|
1097
|
+
|
|
1098
|
+
# Add start point
|
|
1099
|
+
start = rectangle_data["start"]
|
|
1100
|
+
start_x, start_y = start["x"], start["y"]
|
|
1101
|
+
sexp.append([sexpdata.Symbol("start"), start_x, start_y])
|
|
1102
|
+
|
|
1103
|
+
# Add end point
|
|
1104
|
+
end = rectangle_data["end"]
|
|
1105
|
+
end_x, end_y = end["x"], end["y"]
|
|
1106
|
+
sexp.append([sexpdata.Symbol("end"), end_x, end_y])
|
|
1107
|
+
|
|
1108
|
+
# Add stroke
|
|
1109
|
+
stroke_width = rectangle_data.get("stroke_width", 0)
|
|
1110
|
+
stroke_type = rectangle_data.get("stroke_type", "default")
|
|
1111
|
+
stroke_sexp = [sexpdata.Symbol("stroke")]
|
|
1112
|
+
stroke_sexp.append([sexpdata.Symbol("width"), stroke_width])
|
|
1113
|
+
stroke_sexp.append([sexpdata.Symbol("type"), sexpdata.Symbol(stroke_type)])
|
|
1114
|
+
sexp.append(stroke_sexp)
|
|
1115
|
+
|
|
1116
|
+
# Add fill
|
|
1117
|
+
fill_type = rectangle_data.get("fill_type", "none")
|
|
1118
|
+
fill_sexp = [sexpdata.Symbol("fill")]
|
|
1119
|
+
fill_sexp.append([sexpdata.Symbol("type"), sexpdata.Symbol(fill_type)])
|
|
1120
|
+
sexp.append(fill_sexp)
|
|
1121
|
+
|
|
1122
|
+
# Add UUID
|
|
1123
|
+
if "uuid" in rectangle_data:
|
|
1124
|
+
sexp.append([sexpdata.Symbol("uuid"), rectangle_data["uuid"]])
|
|
1125
|
+
|
|
1126
|
+
return sexp
|
|
1127
|
+
|
|
1037
1128
|
def _lib_symbols_to_sexp(self, lib_symbols: Dict[str, Any]) -> List[Any]:
|
|
1038
1129
|
"""Convert lib_symbols to S-expression."""
|
|
1039
1130
|
sexp = [sexpdata.Symbol("lib_symbols")]
|
kicad_sch_api/core/schematic.py
CHANGED
|
@@ -1138,6 +1138,59 @@ class Schematic:
|
|
|
1138
1138
|
logger.debug(f"Added text box: '{text}' at {position} size {size}")
|
|
1139
1139
|
return text_box.uuid
|
|
1140
1140
|
|
|
1141
|
+
def add_rectangle(
|
|
1142
|
+
self,
|
|
1143
|
+
start: Union[Point, Tuple[float, float]],
|
|
1144
|
+
end: Union[Point, Tuple[float, float]],
|
|
1145
|
+
stroke_width: float = 0.0,
|
|
1146
|
+
stroke_type: str = "default",
|
|
1147
|
+
fill_type: str = "none"
|
|
1148
|
+
) -> str:
|
|
1149
|
+
"""
|
|
1150
|
+
Add a graphical rectangle element.
|
|
1151
|
+
|
|
1152
|
+
Args:
|
|
1153
|
+
start: Rectangle start point (top-left)
|
|
1154
|
+
end: Rectangle end point (bottom-right)
|
|
1155
|
+
stroke_width: Border line width
|
|
1156
|
+
stroke_type: Border line type (default, solid, dash, dot, etc.)
|
|
1157
|
+
fill_type: Fill type (none, solid, etc.)
|
|
1158
|
+
|
|
1159
|
+
Returns:
|
|
1160
|
+
UUID of created rectangle element
|
|
1161
|
+
"""
|
|
1162
|
+
if isinstance(start, tuple):
|
|
1163
|
+
start = Point(start[0], start[1])
|
|
1164
|
+
if isinstance(end, tuple):
|
|
1165
|
+
end = Point(end[0], end[1])
|
|
1166
|
+
|
|
1167
|
+
from .types import SchematicRectangle
|
|
1168
|
+
|
|
1169
|
+
rectangle = SchematicRectangle(
|
|
1170
|
+
uuid=str(uuid.uuid4()),
|
|
1171
|
+
start=start,
|
|
1172
|
+
end=end,
|
|
1173
|
+
stroke_width=stroke_width,
|
|
1174
|
+
stroke_type=stroke_type,
|
|
1175
|
+
fill_type=fill_type
|
|
1176
|
+
)
|
|
1177
|
+
|
|
1178
|
+
if "rectangles" not in self._data:
|
|
1179
|
+
self._data["rectangles"] = []
|
|
1180
|
+
|
|
1181
|
+
self._data["rectangles"].append({
|
|
1182
|
+
"uuid": rectangle.uuid,
|
|
1183
|
+
"start": {"x": rectangle.start.x, "y": rectangle.start.y},
|
|
1184
|
+
"end": {"x": rectangle.end.x, "y": rectangle.end.y},
|
|
1185
|
+
"stroke_width": rectangle.stroke_width,
|
|
1186
|
+
"stroke_type": rectangle.stroke_type,
|
|
1187
|
+
"fill_type": rectangle.fill_type
|
|
1188
|
+
})
|
|
1189
|
+
self._modified = True
|
|
1190
|
+
|
|
1191
|
+
logger.debug(f"Added rectangle: {start} to {end}")
|
|
1192
|
+
return rectangle.uuid
|
|
1193
|
+
|
|
1141
1194
|
def set_title_block(
|
|
1142
1195
|
self,
|
|
1143
1196
|
title: str = "",
|
kicad_sch_api/core/types.py
CHANGED
|
@@ -338,6 +338,40 @@ class TextBox:
|
|
|
338
338
|
self.uuid = str(uuid4())
|
|
339
339
|
|
|
340
340
|
|
|
341
|
+
@dataclass
|
|
342
|
+
class SchematicRectangle:
|
|
343
|
+
"""Graphical rectangle element in schematic."""
|
|
344
|
+
|
|
345
|
+
uuid: str
|
|
346
|
+
start: Point
|
|
347
|
+
end: Point
|
|
348
|
+
stroke_width: float = 0.0
|
|
349
|
+
stroke_type: str = "default"
|
|
350
|
+
fill_type: str = "none"
|
|
351
|
+
|
|
352
|
+
def __post_init__(self):
|
|
353
|
+
if not self.uuid:
|
|
354
|
+
self.uuid = str(uuid4())
|
|
355
|
+
|
|
356
|
+
@property
|
|
357
|
+
def width(self) -> float:
|
|
358
|
+
"""Rectangle width."""
|
|
359
|
+
return abs(self.end.x - self.start.x)
|
|
360
|
+
|
|
361
|
+
@property
|
|
362
|
+
def height(self) -> float:
|
|
363
|
+
"""Rectangle height."""
|
|
364
|
+
return abs(self.end.y - self.start.y)
|
|
365
|
+
|
|
366
|
+
@property
|
|
367
|
+
def center(self) -> Point:
|
|
368
|
+
"""Rectangle center point."""
|
|
369
|
+
return Point(
|
|
370
|
+
(self.start.x + self.end.x) / 2,
|
|
371
|
+
(self.start.y + self.end.y) / 2
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
|
|
341
375
|
@dataclass
|
|
342
376
|
class Net:
|
|
343
377
|
"""Electrical net connecting components."""
|
|
@@ -434,6 +468,7 @@ class Schematic:
|
|
|
434
468
|
labels: List[Label] = field(default_factory=list)
|
|
435
469
|
nets: List[Net] = field(default_factory=list)
|
|
436
470
|
sheets: List[Sheet] = field(default_factory=list)
|
|
471
|
+
rectangles: List[SchematicRectangle] = field(default_factory=list)
|
|
437
472
|
lib_symbols: Dict[str, Any] = field(default_factory=dict)
|
|
438
473
|
|
|
439
474
|
def __post_init__(self):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kicad-sch-api
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Professional KiCAD schematic manipulation library with exact format preservation
|
|
5
5
|
Author-email: Circuit-Synth <shane@circuit-synth.com>
|
|
6
6
|
Maintainer-email: Circuit-Synth <shane@circuit-synth.com>
|
|
@@ -5,16 +5,16 @@ kicad_sch_api/core/__init__.py,sha256=ur_KeYBlGKl-e1hLpLdxAhGV2A-PCCGkcqd0r6KSeB
|
|
|
5
5
|
kicad_sch_api/core/component_bounds.py,sha256=BFYJYULyzs5it2hN7bHTimyS9Vet4dxsMklRStob-F4,17509
|
|
6
6
|
kicad_sch_api/core/components.py,sha256=tXRL18GObl2u94wl5jP-1ID56s_UD9F1gQ_iRIyZ_Kw,25290
|
|
7
7
|
kicad_sch_api/core/config.py,sha256=itw0j3DeIEHaFVf8p3mfAS1SP6jclBwvMv7NPdkThE4,4309
|
|
8
|
-
kicad_sch_api/core/formatter.py,sha256=
|
|
8
|
+
kicad_sch_api/core/formatter.py,sha256=PQrZDBgezGlbqw7y3Gnhs0VUYypgc_7pO42Pxkvr-e0,20663
|
|
9
9
|
kicad_sch_api/core/geometry.py,sha256=27SgN0padLbQuTi8MV6UUCp6Pyaiv8V9gmYDOhfwny8,2947
|
|
10
10
|
kicad_sch_api/core/ic_manager.py,sha256=Kg0HIOMU-TGXiIkrnwcHFQ1Kfv_3rW2U1cwBKJsKopc,7219
|
|
11
11
|
kicad_sch_api/core/junctions.py,sha256=Ay6BsWX_DLs-wB0eMA2CytKKq0N8Ja41ZubJWpAqNgM,6122
|
|
12
12
|
kicad_sch_api/core/manhattan_routing.py,sha256=t_T2u0zsQB-a8dTijFmY-qFq-oDt2qDebYyXzD_pBWI,15989
|
|
13
|
-
kicad_sch_api/core/parser.py,sha256=
|
|
13
|
+
kicad_sch_api/core/parser.py,sha256=7bvSwwSoySYi4IjNmolukTFCymtFvOmPssQ9IOoFq4k,57356
|
|
14
14
|
kicad_sch_api/core/pin_utils.py,sha256=XGEow3HzBTyT8a0B_ZC8foMvwzYaENSaqTUwDW1rz24,5417
|
|
15
|
-
kicad_sch_api/core/schematic.py,sha256=
|
|
15
|
+
kicad_sch_api/core/schematic.py,sha256=U9-wrhuGtgRqZJfc76Dj-g1_ZTjrT8R9LmfX-BIBH8w,61201
|
|
16
16
|
kicad_sch_api/core/simple_manhattan.py,sha256=CvIHvwmfABPF-COzhblYxEgRoR_R_eD-lmBFHHjDuMI,7241
|
|
17
|
-
kicad_sch_api/core/types.py,sha256=
|
|
17
|
+
kicad_sch_api/core/types.py,sha256=UmqIvEx_Pd3B9jhvtmgZxx4SAjHUeOZBOEc8VtRILZs,13716
|
|
18
18
|
kicad_sch_api/core/wire_routing.py,sha256=G-C7S-ntQxwuu1z3OaaYlkURXwKE4r4xmhbbi6cvvaI,12830
|
|
19
19
|
kicad_sch_api/core/wires.py,sha256=608t9oH4UzppdGgNgUd-ABK6T-ahyETZwhO_-CuKFO8,8319
|
|
20
20
|
kicad_sch_api/discovery/__init__.py,sha256=qSuCsnC-hVtaLYE8fwd-Gea6JKwEVGPQ-hSNDNJYsIU,329
|
|
@@ -23,9 +23,9 @@ kicad_sch_api/library/__init__.py,sha256=NG9UTdcpn25Bl9tPsYs9ED7bvpaVPVdtLMbnxkQ
|
|
|
23
23
|
kicad_sch_api/library/cache.py,sha256=7na88grl465WHwUOGuOzYrrWwjsMBXhXVtxhnaJ9GBY,33208
|
|
24
24
|
kicad_sch_api/utils/__init__.py,sha256=1V_yGgI7jro6MUc4Pviux_WIeJ1wmiYFID186SZwWLQ,277
|
|
25
25
|
kicad_sch_api/utils/validation.py,sha256=XlWGRZJb3cOPYpU9sLQQgC_NASwbi6W-LCN7PzUmaPY,15626
|
|
26
|
-
kicad_sch_api-0.2.
|
|
27
|
-
kicad_sch_api-0.2.
|
|
28
|
-
kicad_sch_api-0.2.
|
|
29
|
-
kicad_sch_api-0.2.
|
|
30
|
-
kicad_sch_api-0.2.
|
|
31
|
-
kicad_sch_api-0.2.
|
|
26
|
+
kicad_sch_api-0.2.2.dist-info/licenses/LICENSE,sha256=Em65Nvte1G9MHc0rHqtYuGkCPcshD588itTa358J6gs,1070
|
|
27
|
+
kicad_sch_api-0.2.2.dist-info/METADATA,sha256=qyAs7hKSWu-Bwlrfn0yF8R4SdTw4VYOGdqfwxCn25xY,17183
|
|
28
|
+
kicad_sch_api-0.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
29
|
+
kicad_sch_api-0.2.2.dist-info/entry_points.txt,sha256=VWKsFi2Jv7G_tmio3cNVhhIBfv_OZFaKa-T_ED84lc8,57
|
|
30
|
+
kicad_sch_api-0.2.2.dist-info/top_level.txt,sha256=n0ex4gOJ1b_fARowcGqRzyOGZcHRhc5LZa6_vVgGxcI,14
|
|
31
|
+
kicad_sch_api-0.2.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|