Skip to content

Commit

Permalink
Fix region outline arc segments
Browse files Browse the repository at this point in the history
  • Loading branch information
Argmaster committed Oct 15, 2024
1 parent 4e6f310 commit e3f4563
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 9 deletions.
28 changes: 22 additions & 6 deletions src/pygerber/builder/gerber.py
Original file line number Diff line number Diff line change
Expand Up @@ -1348,10 +1348,12 @@ class _LineSegment(_OutlineSegment):


class _CwArcSegment(_OutlineSegment):
begin: Loc2D
center: Loc2D


class _CcwArcSegment(_OutlineSegment):
begin: Loc2D
center: Loc2D


Expand All @@ -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.
Expand All @@ -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(
Expand All @@ -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

Expand All @@ -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

Expand Down Expand Up @@ -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):
Expand All @@ -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:
Expand Down
34 changes: 31 additions & 3 deletions test/test_builder/test_gerber.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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*
"""
)

0 comments on commit e3f4563

Please sign in to comment.