diff options
Diffstat (limited to 'gerber/render_svg.py')
-rw-r--r-- | gerber/render_svg.py | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/gerber/render_svg.py b/gerber/render_svg.py new file mode 100644 index 0000000..bfe6859 --- /dev/null +++ b/gerber/render_svg.py @@ -0,0 +1,106 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright 2013-2014 Paulo Henrique Silva <ph.silva@gmail.com> + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .render import GerberContext, INTERPOLATION_LINEAR, INTERPOLATION_ARC +import svgwrite + + +class Shape(object): + pass + + +class Circle(Shape): + def __init__(self, diameter=0.0): + self.diameter = diameter + + def draw(self, ctx, x, y): + return ctx.dwg.line(start=(ctx.x*300, ctx.y*300), end=(x*300, y*300), stroke="rgb(184, 115, 51)", + stroke_width=2, stroke_linecap="round") + + def flash(self, ctx, x, y): + return ctx.dwg.circle(center=(x*300, y*300), r=300*(self.diameter/2.0), fill="rgb(184, 115, 51)") + + +class Rect(Shape): + def __init__(self, size=(0, 0)): + self.size = size + + def draw(self, ctx, x, y): + return ctx.dwg.line(start=(ctx.x*300, ctx.y*300), end=(x*300, y*300), stroke="rgb(184, 115, 51)", + stroke_width=2, stroke_linecap="butt") + + def flash(self, ctx, x, y): + return ctx.dwg.rect(insert=(300*x, 300*y), size=(300*float(self.size[0]), 300*float(self.size[1])), + fill="rgb(184, 115, 51)") + + +class GerberSvgContext(GerberContext): + def __init__(self): + GerberContext.__init__(self) + + self.apertures = {} + self.dwg = svgwrite.Drawing() + self.dwg.add(self.dwg.rect(insert=(0, 0), size=(2000, 2000), fill="black")) + + def define_aperture(self, d, shape, modifiers): + aperture = None + if shape == "C": + aperture = Circle(diameter=float(modifiers[0][0])) + elif shape == "R": + aperture = Rect(size=modifiers[0][0:2]) + + self.apertures[d] = aperture + + def stroke(self, x, y): + super(GerberSvgContext, self).stroke(x, y) + + if self.interpolation == INTERPOLATION_LINEAR: + self.line(x, y) + elif self.interpolation == INTERPOLATION_ARC: + self.arc(x, y) + + def line(self, x, y): + super(GerberSvgContext, self).line(x, y) + + x, y = self.resolve(x, y) + + ap = self.apertures.get(str(self.aperture), None) + if ap is None: + return + + self.dwg.add(ap.draw(self, x, y)) + + self.move(x, y, resolve=False) + + def arc(self, x, y): + super(GerberSvgContext, self).arc(x, y) + + def flash(self, x, y): + super(GerberSvgContext, self).flash(x, y) + + x, y = self.resolve(x, y) + + ap = self.apertures.get(str(self.aperture), None) + if ap is None: + return + + self.dwg.add(ap.flash(self, x, y)) + + self.move(x, y, resolve=False) + + def dump(self): + self.dwg.saveas("teste.svg") |