diff options
Diffstat (limited to 'gerber/render')
-rw-r--r-- | gerber/render/rs274x_backend.py | 72 |
1 files changed, 65 insertions, 7 deletions
diff --git a/gerber/render/rs274x_backend.py b/gerber/render/rs274x_backend.py index bdb77f4..2a0420e 100644 --- a/gerber/render/rs274x_backend.py +++ b/gerber/render/rs274x_backend.py @@ -22,6 +22,14 @@ class AMGroupContext(object): for primitive in nooffset_group.primitives: if isinstance(primitive, Outline): self._render_outline(primitive) + elif isinstance(primitive, Circle): + self._render_circle(primitive) + elif isinstance(primitive, Rectangle): + self._render_rectangle(primitive) + elif isinstance(primitive, Line): + self._render_line(primitive) + else: + raise ValueError('amgroup') statement = AMParamStmt('AM', name, self._statements_to_string()) return statement @@ -33,10 +41,21 @@ class AMGroupContext(object): macro += statement.to_gerber() return macro + + def _render_circle(self, circle): + self.statements.append(AMCirclePrimitive.from_primitive(circle)) + + def _render_rectangle(self, rectangle): + self.statements.append(AMCenterLinePrimitive.from_primitive(rectangle)) + + def _render_line(self, line): + self.statements.append(AMVectorLinePrimitive.from_primitive(line)) def _render_outline(self, outline): self.statements.append(AMOutlinePrimitive.from_primitive(outline)) - + + def _render_thermal(self, thermal): + pass class Rs274xContext(GerberContext): @@ -59,6 +78,8 @@ class Rs274xContext(GerberContext): self._next_dcode = 10 self._rects = {} self._circles = {} + self._obrounds = {} + self._polygons = {} self._macros = {} self._i_none = 0 @@ -67,9 +88,10 @@ class Rs274xContext(GerberContext): self.settings = settings self._start_header(settings) - self._define_dcodes() + #self._define_dcodes() def _start_header(self, settings): + self.header.append(FSParamStmt.from_settings(settings)) self.header.append(MOParamStmt.from_units(settings.units)) def _define_dcodes(self): @@ -151,8 +173,12 @@ class Rs274xContext(GerberContext): # We already set the function, so the next command doesn't require that func = None - self.body.append(CoordStmt.line(func, self._simplify_point(line.end))) - self._pos = line.end + point = self._simplify_point(line.end) + + # In some files, we see a lot of duplicated ponts, so omit those + if point[0] != None or point[1] != None: + self.body.append(CoordStmt.line(func, self._simplify_point(line.end))) + self._pos = line.end def _render_arc(self, arc, color): @@ -269,10 +295,33 @@ class Rs274xContext(GerberContext): aper = self._get_rectangle(rectangle.width, rectangle.height) self._render_flash(rectangle, aper) + def _get_obround(self, width, height, dcode = None): + + key = (width, height) + aper = self._obrounds.get(key, None) + + if not aper: + if not dcode: + dcode = self._next_dcode + self._next_dcode += 1 + else: + self._next_dcode = max(dcode + 1, self._next_dcode) + + aper = ADParamStmt.obround(dcode, width, height) + self._obrounds[(width, height)] = aper + self.header.append(aper) + + return aper + def _render_obround(self, obround, color): + + aper = self._get_obround(obround.width, obround.height) + self._render_flash(obround, aper) + pass def _render_polygon(self, polygon, color): + raise NotImplementedError('Not implemented yet') pass def _render_drill(self, circle, color): @@ -285,8 +334,19 @@ class Rs274xContext(GerberContext): for primitive in amgroup.primitives: hash += primitive.__class__.__name__[0] + + bbox = primitive.bounding_box + hash += str((bbox[0][1] - bbox[0][0]) * 100000)[0:2] + hash += str((bbox[1][1] - bbox[1][0]) * 100000)[0:2] + if hasattr(primitive, 'primitives'): hash += str(len(primitive.primitives)) + + if isinstance(primitive, Rectangle): + hash += str(primitive.width * 1000000)[0:2] + hash += str(primitive.height * 1000000)[0:2] + elif isinstance(primitive, Circle): + hash += str(primitive.diameter * 1000000)[0:2] return hash @@ -331,9 +391,7 @@ class Rs274xContext(GerberContext): aper = self._get_amacro(amgroup) self._render_flash(amgroup, aper) - - - + def _render_inverted_layer(self): pass |