improved geometry drawing and constraint handling

This commit is contained in:
Morgan 'ARR\!' Allen 2026-01-15 10:54:30 -08:00
parent 8beab90791
commit 1f8457c136

View file

@ -5,6 +5,7 @@ from . import settings
import Part import Part
import Sketcher import Sketcher
from kipy import board_types as BoardTypes
from kipy.board_types import Footprint3DModel, BoardPolygon, BoardSegment, PadStackShape from kipy.board_types import Footprint3DModel, BoardPolygon, BoardSegment, PadStackShape
from kipy.geometry import PolygonWithHoles, PolyLine, PolyLineNode, Vector2 from kipy.geometry import PolygonWithHoles, PolyLine, PolyLineNode, Vector2
from kipy.proto.common.types import KiCadObjectType from kipy.proto.common.types import KiCadObjectType
@ -57,12 +58,18 @@ class BoardSketchObject(BaseObject):
if not board_polygon: if not board_polygon:
raise BoardPolyNotFoundException('Board Polygon not found: ' + self.polygon_id) raise BoardPolyNotFoundException('Board Polygon not found: ' + self.polygon_id)
# XXX: arc_count is a hack to address
# https://codeberg.org/kiconnect/KiConnect/issues/2
# below every other arc is skipped.
arc_count = 0 arc_count = 0
start = None start = None
outline = board_polygon.polygons[0].outline
line = [] line = []
if isinstance(board_polygon, BoardTypes.BoardCircle):
print(board_polygon)
else:
outline = board_polygon.polygons[0].outline
for node in outline: for node in outline:
if node.has_arc: if node.has_arc:
arc_count = arc_count + 1 arc_count = arc_count + 1
@ -72,7 +79,6 @@ class BoardSketchObject(BaseObject):
arc = node.arc arc = node.arc
arc_start = self.point_to_vector(arc.start) arc_start = self.point_to_vector(arc.start)
arc_mid = self.point_to_vector(arc.mid) arc_mid = self.point_to_vector(arc.mid)
arc_end = self.point_to_vector(arc.end) arc_end = self.point_to_vector(arc.end)
@ -112,6 +118,7 @@ class BoardSketchObject(BaseObject):
if len(line) == 2: if len(line) == 2:
idx = feature.addGeometry(Part.LineSegment(line[0], line[1])) idx = feature.addGeometry(Part.LineSegment(line[0], line[1]))
if idx > 0:
feature.addConstraint(Sketcher.Constraint("Coincident", idx - 1, 2, idx, 1)) feature.addConstraint(Sketcher.Constraint("Coincident", idx - 1, 2, idx, 1))
if line[0].x == line[1].x: if line[0].x == line[1].x:
@ -120,13 +127,21 @@ class BoardSketchObject(BaseObject):
if line[0].y == line[1].y: if line[0].y == line[1].y:
feature.addConstraint(Sketcher.Constraint("Horizontal", idx)) feature.addConstraint(Sketcher.Constraint("Horizontal", idx))
line = [ line[1] ] line = [line[1]]
if len(line) == 1: if len(line) == 1:
# XXX what if the final piece of geo is an arc?
idx = feature.addGeometry(Part.LineSegment(start, line[0])) idx = feature.addGeometry(Part.LineSegment(start, line[0]))
feature.addConstraint(Sketcher.Constraint("Coincident", 0, 1, idx, 1)) feature.addConstraint(Sketcher.Constraint("Coincident", 0, 1, idx, 1))
feature.addConstraint(Sketcher.Constraint("Coincident", idx - 1, 2, idx, 2)) feature.addConstraint(Sketcher.Constraint("Coincident", idx - 1, 2, idx, 2))
if line[0].x == start.x:
feature.addConstraint(Sketcher.Constraint("Vertical", idx))
if line[0].y == start.y:
feature.addConstraint(Sketcher.Constraint("Horizontal", idx))
else: else:
FreeCAD.Console.PrintError("Bad line segment:", line) FreeCAD.Console.PrintError("Bad line segment:", line)