summaryrefslogtreecommitdiff
path: root/gerber
diff options
context:
space:
mode:
Diffstat (limited to 'gerber')
-rw-r--r--gerber/am_statements.py18
-rw-r--r--gerber/primitives.py41
-rw-r--r--gerber/render/render.py2
3 files changed, 56 insertions, 5 deletions
diff --git a/gerber/am_statements.py b/gerber/am_statements.py
index 0e4f5f4..599d19d 100644
--- a/gerber/am_statements.py
+++ b/gerber/am_statements.py
@@ -16,9 +16,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-from math import pi
-from .utils import validate_coordinates, inch, metric
-from .primitives import Circle, Line, Rectangle
+import math
+from .utils import validate_coordinates, inch, metric, rotate_point
+from .primitives import Circle, Line, Outline, Rectangle
# TODO: Add support for aperture macro variables
@@ -382,7 +382,15 @@ class AMOutlinePrimitive(AMPrimitive):
return "{code},{exposure},{n_points},{start_point},{points},{rotation}*".format(**data)
def to_primitive(self, units):
- raise NotImplementedError()
+
+ lines = []
+ prev_point = rotate_point(self.points[0], self.rotation)
+ for point in self.points[1:]:
+ cur_point = rotate_point(self.points[0], self.rotation)
+
+ lines.append(Line(prev_point, cur_point, Circle((0,0), 0)))
+
+ return Outline(lines, units=units)
class AMPolygonPrimitive(AMPrimitive):
@@ -762,7 +770,7 @@ class AMCenterLinePrimitive(AMPrimitive):
return fmt.format(**data)
def to_primitive(self, units):
- return Rectangle(self.center, self.width, self.height, rotation=self.rotation * pi / 180.0, units=units)
+ return Rectangle(self.center, self.width, self.height, rotation=math.radians(self.rotation), units=units)
class AMLowerLeftLinePrimitive(AMPrimitive):
diff --git a/gerber/primitives.py b/gerber/primitives.py
index 85035d2..86fd322 100644
--- a/gerber/primitives.py
+++ b/gerber/primitives.py
@@ -758,6 +758,47 @@ class AMGroup(Primitive):
primitive.offset(dx, dy)
self._position = new_pos
+
+
+class Outline(Primitive):
+ """
+ Outlines only exist as the rendering for a apeture macro outline.
+ They don't exist outside of AMGroup objects
+ """
+ def __init__(self, primitives, **kwargs):
+ super(Outline, self).__init__(**kwargs)
+ self.primitives = primitives
+ self._to_convert = ['primitives']
+
+ @property
+ def flashed(self):
+ return True
+
+ @property
+ def bounding_box(self):
+ xlims, ylims = zip(*[p.bounding_box for p in self.primitives])
+ minx, maxx = zip(*xlims)
+ miny, maxy = zip(*ylims)
+ min_x = min(minx)
+ max_x = max(maxx)
+ min_y = min(miny)
+ max_y = max(maxy)
+ return ((min_x, max_x), (min_y, max_y))
+
+ def offset(self, x_offset=0, y_offset=0):
+ for p in self.primitives:
+ p.offset(x_offset, y_offset)
+
+ @property
+ def width(self):
+ bounding_box = self.bounding_box()
+ return bounding_box[0][1] - bounding_box[0][0]
+
+ @property
+ def width(self):
+ bounding_box = self.bounding_box()
+ return bounding_box[1][1] - bounding_box[1][0]
+
class Region(Primitive):
"""
diff --git a/gerber/render/render.py b/gerber/render/render.py
index ac01e52..b518385 100644
--- a/gerber/render/render.py
+++ b/gerber/render/render.py
@@ -152,6 +152,8 @@ class GerberContext(object):
self._render_drill(primitive, self.drill_color)
elif isinstance(primitive, AMGroup):
self._render_amgroup(primitive, color)
+ elif isinstance(primitive, Outline):
+ self._render_region(primitive, color)
elif isinstance(primitive, TestRecord):
self._render_test_record(primitive, color)
else: