[PcbDraw][Fixed] Support for 7.0.1 polygons

- Now KiCad generates polygons in the SVG
Fixes the problem reported in upstream: yaqwsx/PcbDraw#142
This commit is contained in:
Salvador E. Tropea 2023-03-27 10:53:33 -03:00
parent d9cca11384
commit 5f416063be
3 changed files with 50 additions and 1 deletions

View File

@ -20,6 +20,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- KiKit present: problems when no board was specified. (#402)
- Datasheet download:
- Avoid interruptions when too many redirections is detected (#408)
- PcbDraw:
- KiCad 7.0.1 polygons used as board edge. (yaqwsx/PcbDraw#142)
## [1.6.1] - 2023-03-16

View File

@ -289,3 +289,35 @@ index 8ca660e6..9dc45ba9 100644
center = footprint.GetPosition()
orient = math.radians(footprint.GetOrientation().AsDegrees())
## 2023-03-27 Fixe for KiCad 7.0.1 polygons
diff --git a/kibot/PcbDraw/plot.py b/kibot/PcbDraw/plot.py
index 9dc45ba9..8df84469 100644
--- a/kibot/PcbDraw/plot.py
+++ b/kibot/PcbDraw/plot.py
@@ -408,7 +408,22 @@ def get_board_polygon(svg_elements: etree.Element) -> etree.Element:
for group in svg_elements:
for svg_element in group:
if svg_element.tag == "path":
- elements.append(SvgPathItem(svg_element.attrib["d"]))
+ path = svg_element.attrib["d"]
+ # Check if this is a closed polygon (KiCad 7.0.1+)
+ polygon = re.fullmatch(r"M ((\d+\.\d+),(\d+\.\d+) )+Z", path)
+ if polygon:
+ # Yes, decompose it in lines
+ polygon = re.findall(r"(\d+\.\d+),(\d+\.\d+) ", path)
+ start = polygon[0]
+ # Close it
+ polygon.append(polygon[0])
+ # Add the lines
+ for end in polygon[1:]:
+ path = 'M'+start[0]+' '+start[1]+' L'+end[0]+' '+end[1]
+ elements.append(SvgPathItem(path))
+ start = end
+ else:
+ elements.append(SvgPathItem(path))
elif svg_element.tag == "circle":
# Convert circle to path
att = svg_element.attrib

View File

@ -408,7 +408,22 @@ def get_board_polygon(svg_elements: etree.Element) -> etree.Element:
for group in svg_elements:
for svg_element in group:
if svg_element.tag == "path":
elements.append(SvgPathItem(svg_element.attrib["d"]))
path = svg_element.attrib["d"]
# Check if this is a closed polygon (KiCad 7.0.1+)
polygon = re.fullmatch(r"M ((\d+\.\d+),(\d+\.\d+) )+Z", path)
if polygon:
# Yes, decompose it in lines
polygon = re.findall(r"(\d+\.\d+),(\d+\.\d+) ", path)
start = polygon[0]
# Close it
polygon.append(polygon[0])
# Add the lines
for end in polygon[1:]:
path = 'M'+start[0]+' '+start[1]+' L'+end[0]+' '+end[1]
elements.append(SvgPathItem(path))
start = end
else:
elements.append(SvgPathItem(path))
elif svg_element.tag == "circle":
# Convert circle to path
att = svg_element.attrib