diff --git a/src/pygerber/builder/gerber.py b/src/pygerber/builder/gerber.py index a149d7c0..65ad6274 100644 --- a/src/pygerber/builder/gerber.py +++ b/src/pygerber/builder/gerber.py @@ -1348,10 +1348,12 @@ class _LineSegment(_OutlineSegment): class _CwArcSegment(_OutlineSegment): + begin: Loc2D center: Loc2D class _CcwArcSegment(_OutlineSegment): + begin: Loc2D center: Loc2D @@ -1370,6 +1372,7 @@ def __init__(self, builder: GerberX3Builder, begin: Loc2D) -> None: self._builder = builder self._begin = begin self._outline: list[_OutlineSegment] = [] + self._previous_end = begin def add_line(self, to: tuple[float, float]) -> Self: """Add a line to the region outline. @@ -1386,6 +1389,7 @@ def add_line(self, to: tuple[float, float]) -> Self: """ self._outline.append(_LineSegment(end=to)) + self._previous_end = to return self def add_clockwise_arc( @@ -1406,7 +1410,9 @@ def add_clockwise_arc( Same RegionCreator object for method chaining. """ - self._outline.append(_CwArcSegment(center=center, end=to)) + self._outline.append( + _CwArcSegment(begin=self._previous_end, center=center, end=to) + ) self._previous_end = to return self @@ -1428,7 +1434,9 @@ def add_counterclockwise_arc( Same RegionCreator object for method chaining. """ - self._outline.append(_CcwArcSegment(center=center, end=to)) + self._outline.append( + _CcwArcSegment(begin=self._previous_end, center=center, end=to) + ) self._previous_end = to return self @@ -1484,8 +1492,12 @@ def _() -> Iterable[Node]: yield D01( x=self._builder._pack_x(segment.end[0]), # noqa: SLF001 y=self._builder._pack_y(segment.end[1]), # noqa: SLF001 - i=self._builder._pack_i(segment.center[0]), # noqa: SLF001 - j=self._builder._pack_j(segment.center[1]), # noqa: SLF001 + i=self._builder._pack_i( # noqa: SLF001 + segment.center[0] - segment.begin[0] + ), + j=self._builder._pack_j( # noqa: SLF001 + segment.center[1] - segment.begin[1] + ), ) elif isinstance(segment, _CcwArcSegment): @@ -1496,8 +1508,12 @@ def _() -> Iterable[Node]: yield D01( x=self._builder._pack_x(segment.end[0]), # noqa: SLF001 y=self._builder._pack_y(segment.end[1]), # noqa: SLF001 - i=self._builder._pack_i(segment.center[0]), # noqa: SLF001 - j=self._builder._pack_j(segment.center[1]), # noqa: SLF001 + i=self._builder._pack_i( # noqa: SLF001 + segment.center[0] - segment.begin[0] + ), + j=self._builder._pack_j( # noqa: SLF001 + segment.center[1] - segment.begin[1] + ), ) else: diff --git a/test/test_builder/test_gerber.py b/test/test_builder/test_gerber.py index ee926661..30c2fc25 100644 --- a/test/test_builder/test_gerber.py +++ b/test/test_builder/test_gerber.py @@ -757,9 +757,7 @@ def test_two_trace_connect_two_pads( class TestRegions: - def test_region_lines_only( - self, builder: GerberX3Builder, default_header: str - ) -> None: + def test_lines_only(self, builder: GerberX3Builder, default_header: str) -> None: ( builder.new_region((0, 0)) .add_line((0, 2)) @@ -785,5 +783,35 @@ def test_region_lines_only( G37* X0Y0D02* M02* +""" + ) + + def test_lines_and_arcs( + self, builder: GerberX3Builder, default_header: str + ) -> None: + ( + builder.new_region((0, 0)) + .add_line((0, 2)) + .add_line((2, 2)) + .add_clockwise_arc((0, 0), (0, 2)) + .create() + ) + + assert ( + builder.get_code().dumps() + == f"""{default_header} +%ADD10C,1.0*% +G75* +D10* +G36* +X0Y0D02* +G01* +X0Y2000000D01* +X2000000Y2000000D01* +G02* +X0Y0I-2000000J0D01* +G37* +X0Y0D02* +M02* """ )