diff options
Diffstat (limited to 'gerbonara/gerber/graphic_objects.py')
-rw-r--r-- | gerbonara/gerber/graphic_objects.py | 65 |
1 files changed, 49 insertions, 16 deletions
diff --git a/gerbonara/gerber/graphic_objects.py b/gerbonara/gerber/graphic_objects.py index f97aff4..032b562 100644 --- a/gerbonara/gerber/graphic_objects.py +++ b/gerbonara/gerber/graphic_objects.py @@ -2,9 +2,8 @@ import math from dataclasses import dataclass, KW_ONLY, astuple, replace, fields -from .utils import MM +from .utils import MM, InterpMode from . import graphic_primitives as gp -from .gerber_statements import * def convert(value, src, dst): @@ -76,15 +75,21 @@ class Flash(GerberObject): def to_statements(self, gs): yield from gs.set_polarity(self.polarity_dark) yield from gs.set_aperture(self.aperture) - yield FlashStmt(self.x, self.y, unit=self.unit) + + x = gs.file_settings.write_gerber_value(self.x, self.unit) + y = gs.file_settings.write_gerber_value(self.y, self.unit) + yield f'D03X{x}Y{y}*' + gs.update_point(self.x, self.y, unit=self.unit) def to_xnc(self, ctx): yield from ctx.select_tool(self.tool) yield from ctx.drill_mode() + x = ctx.settings.write_gerber_value(self.x, self.unit) y = ctx.settings.write_gerber_value(self.y, self.unit) yield f'X{x}Y{y}' + ctx.set_current_point(self.unit, self.x, self.y) def curve_length(self, unit=MM): @@ -143,24 +148,35 @@ class Region(GerberObject): def to_statements(self, gs): yield from gs.set_polarity(self.polarity_dark) - yield RegionStartStmt() + yield 'G36*' yield from gs.set_current_point(self.poly.outline[0], unit=self.unit) for point, arc_center in zip(self.poly.outline[1:], self.poly.arc_centers): if arc_center is None: - yield from gs.set_interpolation_mode(LinearModeStmt) - yield InterpolateStmt(*point, unit=self.unit) + yield from gs.set_interpolation_mode(InterpMode.LINEAR) + + x = gs.file_settings.write_gerber_value(point[0], self.unit) + y = gs.file_settings.write_gerber_value(point[1], self.unit) + yield f'D01X{x}Y{y}*' + gs.update_point(*point, unit=self.unit) else: clockwise, (cx, cy) = arc_center x2, y2 = point - yield from gs.set_interpolation_mode(CircularCWModeStmt if clockwise else CircularCCWModeStmt) - yield InterpolateStmt(x2, y2, cx-x2, cy-y2, unit=self.unit) + yield from gs.set_interpolation_mode(InterpMode.CIRCULAR_CW if clockwise else InterpMode.CIRCULAR_CCW) + + x = gs.file_settings.write_gerber_value(x2, self.unit) + y = gs.file_settings.write_gerber_value(y2, self.unit) + # TODO are these coordinates absolute or relative now?! + i = gs.file_settings.write_gerber_value(cx-x2, self.unit) + j = gs.file_settings.write_gerber_value(cy-y2, self.unit) + yield f'D01X{x}Y{y}I{i}J{j}*' + gs.update_point(x2, y2, unit=self.unit) - yield RegionEndStmt() + yield 'G37*' @dataclass @@ -207,15 +223,23 @@ class Line(GerberObject): def to_statements(self, gs): yield from gs.set_polarity(self.polarity_dark) yield from gs.set_aperture(self.aperture) - yield from gs.set_interpolation_mode(LinearModeStmt) + yield from gs.set_interpolation_mode(InterpMode.LINEAR) yield from gs.set_current_point(self.p1, unit=self.unit) - yield InterpolateStmt(*self.p2, unit=self.unit) + + x = gs.file_settings.write_gerber_value(self.x2, self.unit) + y = gs.file_settings.write_gerber_value(self.y2, self.unit) + yield f'D01X{x}Y{y}*' + gs.update_point(*self.p2, unit=self.unit) def to_xnc(self, ctx): yield from ctx.select_tool(self.tool) yield from ctx.route_mode(self.unit, *self.p1) - yield 'G01' + 'X' + ctx.settings.write_gerber_value(self.p2[0], self.unit) + 'Y' + ctx.settings.write_gerber_value(self.p2[1], self.unit) + + x = ctx.settings.write_gerber_value(self.x2, self.unit) + y = ctx.settings.write_gerber_value(self.y2, self.unit) + yield f'G01X{x}Y{y}' + ctx.set_current_point(self.unit, *self.p2) def curve_length(self, unit=MM): @@ -280,20 +304,29 @@ class Arc(GerberObject): def to_statements(self, gs): yield from gs.set_polarity(self.polarity_dark) yield from gs.set_aperture(self.aperture) - yield from gs.set_interpolation_mode(CircularCCWModeStmt) + # TODO is the following line correct? + yield from gs.set_interpolation_mode(InterpMode.CIRCULAR_CW if self.clockwise else InterpMode.CIRCULAR_CCW) yield from gs.set_current_point(self.p1, unit=self.unit) - yield InterpolateStmt(self.x2, self.y2, self.cx, self.cy, unit=self.unit) + + x = gs.file_settings.write_gerber_value(self.x2, self.unit) + y = gs.file_settings.write_gerber_value(self.y2, self.unit) + i = gs.file_settings.write_gerber_value(self.cx, self.unit) + j = gs.file_settings.write_gerber_value(self.cy, self.unit) + yield f'D01X{x}Y{y}I{i}J{j}*' + gs.update_point(*self.p2, unit=self.unit) def to_xnc(self, ctx): yield from ctx.select_tool(self.tool) yield from ctx.route_mode(self.unit, self.x1, self.y1) code = 'G02' if self.clockwise else 'G03' + x = ctx.settings.write_gerber_value(self.x2, self.unit) y = ctx.settings.write_gerber_value(self.y2, self.unit) - i = ctx.settings.write_gerber_value(self.cx - self.x1, self.unit) - j = ctx.settings.write_gerber_value(self.cy - self.y1, self.unit) + i = ctx.settings.write_gerber_value(self.cx, self.unit) + j = ctx.settings.write_gerber_value(self.cy, self.unit) yield f'{code}X{x}Y{y}I{i}J{j}' + ctx.set_current_point(self.unit, self.x2, self.y2) def curve_length(self, unit=MM): |