From b5f8451c8f37acf9148bbd09f3326eb5aba3e053 Mon Sep 17 00:00:00 2001 From: Hamilton Kibbe Date: Wed, 8 Oct 2014 18:34:16 -0400 Subject: cairo support --- gerber/render/cairo_backend.py | 156 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 gerber/render/cairo_backend.py (limited to 'gerber') diff --git a/gerber/render/cairo_backend.py b/gerber/render/cairo_backend.py new file mode 100644 index 0000000..d5efc2d --- /dev/null +++ b/gerber/render/cairo_backend.py @@ -0,0 +1,156 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright 2014 Hamilton Kibbe + +# 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 +from .apertures import Circle, Rect, Obround, Polygon +import cairo +import math + +SCALE = 200. + +class CairoCircle(Circle): + def line(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): + ctx.set_source_rgb (*color) + ctx.set_line_width(self.diameter * SCALE) + ctx.set_line_cap(cairo.LINE_CAP_ROUND) + ctx.line_to(x * SCALE, y * SCALE) + ctx.stroke() + + def arc(self, ctx, x, y, i, j, direction, color=(184/255., 115/255., 51/255.)): + ctx_x, ctx_y = ctx.get_current_point() + + # Do the math + center = ((x + i) * SCALE, (y + j) * SCALE) + radius = math.sqrt(math.pow(ctx_x - center[0], 2) + math.pow(ctx_y - center[1], 2)) + delta_x0 = (ctx_x - center[0]) + delta_y0 = (ctx_y - center[1]) + delta_x1 = (x * SCALE - center[0]) + delta_y1 = (y * SCALE - center[1]) + theta0 = math.atan2(delta_y0, delta_x0) + theta1 = math.atan2(delta_y1, delta_x1) + # Draw the arc + ctx.set_source_rgb (*color) + ctx.set_line_width(self.diameter * SCALE) + ctx.set_line_cap(cairo.LINE_CAP_ROUND) + if direction == 'clockwise': + ctx.arc_negative(center[0], center[1], radius, theta0, theta1) + else: + ctx.arc(center[0], center[1], radius, theta0, theta1) + ctx.stroke() + + def flash(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): + ctx.set_source_rgb (*color) + ctx.set_line_width(0) + ctx.arc(x * SCALE, y * SCALE, (self.diameter/2.) * SCALE, 0, 2 * math.pi) + ctx.fill() + +class CairoRect(Rect): + def line(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): + ctx.set_source_rgb (*color) + ctx.set_line_width(self.diameter * SCALE) + ctx.set_line_cap(cairo.LINE_CAP_SQUARE) + ctx.line_to(x * SCALE, y * SCALE) + ctx.stroke() + + def flash(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): + xsize, ysize = self.size + ctx.set_source_rgb (*color) + ctx.set_line_width(0) + x0 = SCALE * (x - (xsize / 2.)) + y0 = SCALE * (y - (ysize / 2.)) + + ctx.rectangle(x0,y0,SCALE * xsize, SCALE * ysize) + ctx.fill() + + + +class GerberCairoContext(GerberContext): + def __init__(self, surface=None, size=(1000, 1000), + color='rgb(184, 115, 51)', drill_color='gray'): + GerberContext.__init__(self) + if surface is None: + self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, + size[0], size[1]) + else: + self.surface = surface + self.ctx = cairo.Context(self.surface) + self.size = size + self.ctx.translate(0, self.size[1]) + self.ctx.scale(1,-1) + self.apertures = {} + self.color = color + self.drill_color = drill_color + self.background = False + + def set_bounds(self, bounds): + xbounds, ybounds = bounds + self.ctx.rectangle(SCALE * xbounds[0], SCALE * ybounds[0], SCALE * (xbounds[1]- xbounds[0]), SCALE * (ybounds[1] - ybounds[0])) + self.ctx.set_source_rgb(0,0,0) + self.ctx.fill() + + def define_aperture(self, d, shape, modifiers): + aperture = None + if shape == 'C': + aperture = CairoCircle(diameter=float(modifiers[0][0])) + elif shape == 'R': + aperture = CairoRect(size=modifiers[0][0:2]) + self.apertures[d] = aperture + + def stroke(self, x, y, i, j): + super(GerberCairoContext, self).stroke(x, y, i, j) + + if self.interpolation == 'linear': + self.line(x, y) + elif self.interpolation == 'arc': + self.arc(x, y, i, j) + self.move(x,y) + + def line(self, x, y): + x, y = self.resolve(x, y) + ap = self.apertures.get(self.aperture, None) + if ap is None: + return + ap.line(self.ctx, x, y) + + def arc(self, x, y, i, j): + super(GerberCairoContext, self).arc(x, y, i, j) + ap = self.apertures.get(self.aperture, None) + if ap is None: + return + ap.arc(self.ctx, x, y, i, j, self.direction) + + + def flash(self, x, y): + x, y = self.resolve(x, y) + ap = self.apertures.get(self.aperture, None) + if ap is None: + return + ap.flash(self.ctx, x, y) + self.move(x, y, resolve=False) + + def move(self, x, y, resolve=True): + super(GerberCairoContext, self).move(x, y, resolve) + if x is None: + x = self.x + if y is None: + y = self.y + if self.x is not None and self.y is not None: + self.ctx.move_to(x * SCALE, y * SCALE) + + + def dump(self, filename): + self.surface.write_to_png(filename) \ No newline at end of file -- cgit From 76abd9e3f8c8a77e589fd72548ff35cedb5a769d Mon Sep 17 00:00:00 2001 From: Paulo Henrique Silva Date: Sun, 26 Oct 2014 21:39:51 -0200 Subject: Fix parsing of Unknown commands --- gerber/rs274x.py | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'gerber') diff --git a/gerber/rs274x.py b/gerber/rs274x.py index f18a35d..627fcf9 100644 --- a/gerber/rs274x.py +++ b/gerber/rs274x.py @@ -308,6 +308,10 @@ class GerberParser(object): if line.find('*') > 0: yield UnknownStmt(line) + did_something = True + line = "" + continue + oldline = line def evaluate(self, stmt): -- cgit From 0f85d5b07082a34ee053a7ada4e31e52d584ac46 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Silva Date: Sun, 26 Oct 2014 22:25:26 -0200 Subject: Fix ValueError, missing self. --- gerber/gerber_statements.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gerber') diff --git a/gerber/gerber_statements.py b/gerber/gerber_statements.py index e392ec5..32d3784 100644 --- a/gerber/gerber_statements.py +++ b/gerber/gerber_statements.py @@ -394,7 +394,7 @@ class AMParamStmt(ParamStmt): return '%AM{0}*{1}*%'.format(self.name, self.macro) def __str__(self): - return '' % (self.name, macro) + return '' % (self.name, self.macro) class INParamStmt(ParamStmt): -- cgit From 0a0331c5f389c4a6574d42e7c2ad9811fdc6f443 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Silva Date: Sun, 26 Oct 2014 22:26:04 -0200 Subject: Fix parsing for AM macros and support for zero sized circle primitives --- gerber/rs274x.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'gerber') diff --git a/gerber/rs274x.py b/gerber/rs274x.py index 627fcf9..08c492a 100644 --- a/gerber/rs274x.py +++ b/gerber/rs274x.py @@ -127,11 +127,11 @@ class GerberParser(object): MO = r"(?PMO)(?P(MM|IN))" IP = r"(?PIP)(?P(POS|NEG))" LP = r"(?PLP)(?P(D|C))" - AD_CIRCLE = r"(?PAD)D(?P\d+)(?PC)[,](?P[^,]*)" - AD_RECT = r"(?PAD)D(?P\d+)(?PR)[,]?(?P[^,]+)?" + AD_CIRCLE = r"(?PAD)D(?P\d+)(?PC)[,]?(?P[^,]*)?" + AD_RECT = r"(?PAD)D(?P\d+)(?PR)[,](?P[^,]*)" AD_OBROUND = r"(?PAD)D(?P\d+)(?PO)[,](?P[^,]*)" AD_POLY = r"(?PAD)D(?P\d+)(?PP)[,](?P[^,]*)" - AD_MACRO = r"(?PAD)D(?P\d+)(?P{name})[,]?(?P[^,]+)?".format(name=NAME) + AD_MACRO = r"(?PAD)D(?P\d+)(?P{name})[,]?(?P[^,]*)?".format(name=NAME) AM = r"(?PAM)(?P{name})\*(?P.*)".format(name=NAME) # begin deprecated -- cgit From f23c3cb00a8966e1bdc177348c980bd40be4c522 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Silva Date: Sun, 26 Oct 2014 22:26:50 -0200 Subject: Add simple hack to allow evaluation when gerber have macros and polygon --- gerber/rs274x.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'gerber') diff --git a/gerber/rs274x.py b/gerber/rs274x.py index 08c492a..c01f027 100644 --- a/gerber/rs274x.py +++ b/gerber/rs274x.py @@ -412,9 +412,11 @@ class GerberParser(object): elif stmt.op == "D03": primitive = copy.deepcopy(self.apertures[self.aperture]) - primitive.position = (x, y) - primitive.level_polarity = self.level_polarity - self.primitives.append(primitive) + # XXX: temporary fix because there are no primitives for Macros and Polygon + if primitive is not None: + primitive.position = (x, y) + primitive.level_polarity = self.level_polarity + self.primitives.append(primitive) self.x, self.y = x, y def _evaluate_aperture(self, stmt): -- cgit From c285e6b014f38716b257b6cc77245c37ac62b4f1 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Silva Date: Sun, 26 Oct 2014 22:27:12 -0200 Subject: style change --- gerber/rs274x.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'gerber') diff --git a/gerber/rs274x.py b/gerber/rs274x.py index c01f027..f7be44d 100644 --- a/gerber/rs274x.py +++ b/gerber/rs274x.py @@ -386,12 +386,13 @@ class GerberParser(object): def _evaluate_coord(self, stmt): x = self.x if stmt.x is None else stmt.x y = self.y if stmt.y is None else stmt.y + if stmt.function in ("G01", "G1"): self.interpolation = 'linear' elif stmt.function in ('G02', 'G2', 'G03', 'G3'): self.interpolation = 'arc' - self.direction = ('clockwise' if stmt.function in ('G02', 'G2') - else 'counterclockwise') + self.direction = ('clockwise' if stmt.function in ('G02', 'G2') else 'counterclockwise') + if stmt.op == "D01": if self.region_mode == 'on': if self.current_region is None: -- cgit From 0437e4198a0ff5d909d4321768341a173930904c Mon Sep 17 00:00:00 2001 From: Hamilton Kibbe Date: Sun, 26 Oct 2014 22:35:56 -0400 Subject: cairo working --- gerber/primitives.py | 17 +++ gerber/render/__init__.py | 2 +- gerber/render/cairo_backend.py | 213 ++++++++++++++++++-------------------- gerber/render/svgwrite_backend.py | 6 +- 4 files changed, 123 insertions(+), 115 deletions(-) (limited to 'gerber') diff --git a/gerber/primitives.py b/gerber/primitives.py index 670b758..b3869e1 100644 --- a/gerber/primitives.py +++ b/gerber/primitives.py @@ -171,6 +171,23 @@ class Obround(Primitive): max_y = self.upper_right[1] return ((min_x, max_x), (min_y, max_y)) + @property + def subshapes(self): + if self.orientation == 'vertical': + circle1 = Circle((self.position[0], self.position[1] + + (self.height-self.width) / 2.), self.width) + circle2 = Circle((self.position[0], self.position[1] - + (self.height-self.width) / 2.), self.width) + rect = Rectangle(self.position, self.width, + (self.height - self.width)) + else: + circle1 = Circle((self.position[0] - (self.height - self.width) / 2., + self.position[1]), self.height) + circle2 = Circle((self.position[0] - (self.height - self.width) / 2., + self.position[1]), self.height) + rect = Rectangle(self.position, (self.width - self.height), + self.height) + return {'circle1': circle1, 'circle2': circle2, 'rectangle': rect} class Polygon(Primitive): """ diff --git a/gerber/render/__init__.py b/gerber/render/__init__.py index 0d3527b..b4af4ad 100644 --- a/gerber/render/__init__.py +++ b/gerber/render/__init__.py @@ -25,4 +25,4 @@ SVG is the only supported format. from svgwrite_backend import GerberSvgContext - +from cairo_backend import GerberCairoContext diff --git a/gerber/render/cairo_backend.py b/gerber/render/cairo_backend.py index d5efc2d..f5e5aca 100644 --- a/gerber/render/cairo_backend.py +++ b/gerber/render/cairo_backend.py @@ -16,71 +16,71 @@ # limitations under the License. from .render import GerberContext -from .apertures import Circle, Rect, Obround, Polygon -import cairo +from operator import mul +import cairocffi as cairo import math -SCALE = 200. - -class CairoCircle(Circle): - def line(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): - ctx.set_source_rgb (*color) - ctx.set_line_width(self.diameter * SCALE) - ctx.set_line_cap(cairo.LINE_CAP_ROUND) - ctx.line_to(x * SCALE, y * SCALE) - ctx.stroke() - - def arc(self, ctx, x, y, i, j, direction, color=(184/255., 115/255., 51/255.)): - ctx_x, ctx_y = ctx.get_current_point() - - # Do the math - center = ((x + i) * SCALE, (y + j) * SCALE) - radius = math.sqrt(math.pow(ctx_x - center[0], 2) + math.pow(ctx_y - center[1], 2)) - delta_x0 = (ctx_x - center[0]) - delta_y0 = (ctx_y - center[1]) - delta_x1 = (x * SCALE - center[0]) - delta_y1 = (y * SCALE - center[1]) - theta0 = math.atan2(delta_y0, delta_x0) - theta1 = math.atan2(delta_y1, delta_x1) - # Draw the arc - ctx.set_source_rgb (*color) - ctx.set_line_width(self.diameter * SCALE) - ctx.set_line_cap(cairo.LINE_CAP_ROUND) - if direction == 'clockwise': - ctx.arc_negative(center[0], center[1], radius, theta0, theta1) - else: - ctx.arc(center[0], center[1], radius, theta0, theta1) - ctx.stroke() - - def flash(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): - ctx.set_source_rgb (*color) - ctx.set_line_width(0) - ctx.arc(x * SCALE, y * SCALE, (self.diameter/2.) * SCALE, 0, 2 * math.pi) - ctx.fill() - -class CairoRect(Rect): - def line(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): - ctx.set_source_rgb (*color) - ctx.set_line_width(self.diameter * SCALE) - ctx.set_line_cap(cairo.LINE_CAP_SQUARE) - ctx.line_to(x * SCALE, y * SCALE) - ctx.stroke() - - def flash(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): - xsize, ysize = self.size - ctx.set_source_rgb (*color) - ctx.set_line_width(0) - x0 = SCALE * (x - (xsize / 2.)) - y0 = SCALE * (y - (ysize / 2.)) - - ctx.rectangle(x0,y0,SCALE * xsize, SCALE * ysize) - ctx.fill() - +SCALE = 300. + + +#class CairoCircle(Circle): +# def line(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): +# ctx.set_source_rgb (*color) +# ctx.set_line_width(self.diameter * SCALE) +# ctx.set_line_cap(cairo.LINE_CAP_ROUND) +# ctx.line_to(x * SCALE, y * SCALE) +# ctx.stroke() +# +# def arc(self, ctx, x, y, i, j, direction, color=(184/255., 115/255., 51/255.)): +# ctx_x, ctx_y = ctx.get_current_point() +# +# # Do the math +# center = ((x + i) * SCALE, (y + j) * SCALE) +# radius = math.sqrt(math.pow(ctx_x - center[0], 2) + math.pow(ctx_y - center[1], 2)) +# delta_x0 = (ctx_x - center[0]) +# delta_y0 = (ctx_y - center[1]) +# delta_x1 = (x * SCALE - center[0]) +# delta_y1 = (y * SCALE - center[1]) +# theta0 = math.atan2(delta_y0, delta_x0) +# theta1 = math.atan2(delta_y1, delta_x1) +# # Draw the arc +# ctx.set_source_rgb (*color) +# ctx.set_line_width(self.diameter * SCALE) +# ctx.set_line_cap(cairo.LINE_CAP_ROUND) +# if direction == 'clockwise': +# ctx.arc_negative(center[0], center[1], radius, theta0, theta1) +# else: +# ctx.arc(center[0], center[1], radius, theta0, theta1) +# ctx.stroke() +# +# def flash(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): +# ctx.set_source_rgb (*color) +# ctx.set_line_width(0) +# ctx.arc(x * SCALE, y * SCALE, (self.diameter/2.) * SCALE, 0, 2 * math.pi) +# ctx.fill() +# +#class CairoRect(Rect): +# def line(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): +# ctx.set_source_rgb (*color) +# ctx.set_line_width(self.diameter * SCALE) +# ctx.set_line_cap(cairo.LINE_CAP_SQUARE) +# ctx.line_to(x * SCALE, y * SCALE) +# ctx.stroke() +# +# def flash(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): +# xsize, ysize = self.size +# ctx.set_source_rgb (*color) +# ctx.set_line_width(0) +# x0 = SCALE * (x - (xsize / 2.)) +# y0 = SCALE * (y - (ysize / 2.)) +# +# ctx.rectangle(x0,y0,SCALE * xsize, SCALE * ysize) +# ctx.fill() +# class GerberCairoContext(GerberContext): - def __init__(self, surface=None, size=(1000, 1000), - color='rgb(184, 115, 51)', drill_color='gray'): + def __init__(self, surface=None, size=(1000, 1000)): GerberContext.__init__(self) if surface is None: self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, @@ -90,10 +90,9 @@ class GerberCairoContext(GerberContext): self.ctx = cairo.Context(self.surface) self.size = size self.ctx.translate(0, self.size[1]) - self.ctx.scale(1,-1) + self.scale = (SCALE,SCALE) + self.ctx.scale(1, -1) self.apertures = {} - self.color = color - self.drill_color = drill_color self.background = False def set_bounds(self, bounds): @@ -102,55 +101,47 @@ class GerberCairoContext(GerberContext): self.ctx.set_source_rgb(0,0,0) self.ctx.fill() - def define_aperture(self, d, shape, modifiers): - aperture = None - if shape == 'C': - aperture = CairoCircle(diameter=float(modifiers[0][0])) - elif shape == 'R': - aperture = CairoRect(size=modifiers[0][0:2]) - self.apertures[d] = aperture - - def stroke(self, x, y, i, j): - super(GerberCairoContext, self).stroke(x, y, i, j) - - if self.interpolation == 'linear': - self.line(x, y) - elif self.interpolation == 'arc': - self.arc(x, y, i, j) - self.move(x,y) - - def line(self, x, y): - x, y = self.resolve(x, y) - ap = self.apertures.get(self.aperture, None) - if ap is None: - return - ap.line(self.ctx, x, y) - - def arc(self, x, y, i, j): - super(GerberCairoContext, self).arc(x, y, i, j) - ap = self.apertures.get(self.aperture, None) - if ap is None: - return - ap.arc(self.ctx, x, y, i, j, self.direction) - - - def flash(self, x, y): - x, y = self.resolve(x, y) - ap = self.apertures.get(self.aperture, None) - if ap is None: - return - ap.flash(self.ctx, x, y) - self.move(x, y, resolve=False) - - def move(self, x, y, resolve=True): - super(GerberCairoContext, self).move(x, y, resolve) - if x is None: - x = self.x - if y is None: - y = self.y - if self.x is not None and self.y is not None: - self.ctx.move_to(x * SCALE, y * SCALE) + def _render_line(self, line, color): + start = map(mul, line.start, self.scale) + end = map(mul, line.end, self.scale) + self.ctx.set_source_rgb (*color) + self.ctx.set_line_width(line.width * SCALE) + self.ctx.set_line_cap(cairo.LINE_CAP_ROUND) + self.ctx.move_to(*start) + self.ctx.line_to(*end) + self.ctx.stroke() + + def _render_region(self, region, color): + points = [tuple(map(mul, point, self.scale)) for point in region.points] + self.ctx.set_source_rgb (*color) + self.ctx.set_line_width(0) + self.ctx.move_to(*points[0]) + for point in points[1:]: + self.ctx.move_to(*point) + self.ctx.fill() + + def _render_circle(self, circle, color): + center = map(mul, circle.position, self.scale) + self.ctx.set_source_rgb (*color) + self.ctx.set_line_width(0) + self.ctx.arc(*center, radius=circle.radius * SCALE, angle1=0, angle2=2 * math.pi) + self.ctx.fill() + + def _render_rectangle(self, rectangle, color): + ll = map(mul, rectangle.lower_left, self.scale) + width, height = tuple(map(mul, (rectangle.width, rectangle.height), map(abs, self.scale))) + self.ctx.set_source_rgb (*color) + self.ctx.set_line_width(0) + self.ctx.rectangle(*ll,width=width, height=height) + self.ctx.fill() + + def _render_obround(self, obround, color): + self._render_circle(obround.subshapes['circle1'], color) + self._render_circle(obround.subshapes['circle2'], color) + self._render_rectangle(obround.subshapes['rectangle'], color) + def _render_drill(self, circle, color): + self._render_circle(circle, color) def dump(self, filename): self.surface.write_to_png(filename) \ No newline at end of file diff --git a/gerber/render/svgwrite_backend.py b/gerber/render/svgwrite_backend.py index d9456a5..2df87b3 100644 --- a/gerber/render/svgwrite_backend.py +++ b/gerber/render/svgwrite_backend.py @@ -148,8 +148,8 @@ class GerberSvgContext(GerberContext): self.dwg.add(c2) self.dwg.add(rect) - def _render_drill(self, primitive, color): - center = map(mul, primitive.position, self.scale) - hit = self.dwg.circle(center=center, r=SCALE * primitive.radius, + def _render_drill(self, circle, color): + center = map(mul, circle.position, self.scale) + hit = self.dwg.circle(center=center, r=SCALE * circle.radius, fill=svg_color(color)) self.dwg.add(hit) -- cgit From c08cdf84bceb43ef452e48396bfbe508f0bdd338 Mon Sep 17 00:00:00 2001 From: Hamilton Kibbe Date: Sun, 26 Oct 2014 22:40:55 -0400 Subject: removed dead code --- gerber/render/cairo_backend.py | 64 +++--------------------------------------- 1 file changed, 4 insertions(+), 60 deletions(-) (limited to 'gerber') diff --git a/gerber/render/cairo_backend.py b/gerber/render/cairo_backend.py index f5e5aca..df513bb 100644 --- a/gerber/render/cairo_backend.py +++ b/gerber/render/cairo_backend.py @@ -23,70 +23,14 @@ import math SCALE = 300. -#class CairoCircle(Circle): -# def line(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): -# ctx.set_source_rgb (*color) -# ctx.set_line_width(self.diameter * SCALE) -# ctx.set_line_cap(cairo.LINE_CAP_ROUND) -# ctx.line_to(x * SCALE, y * SCALE) -# ctx.stroke() -# -# def arc(self, ctx, x, y, i, j, direction, color=(184/255., 115/255., 51/255.)): -# ctx_x, ctx_y = ctx.get_current_point() -# -# # Do the math -# center = ((x + i) * SCALE, (y + j) * SCALE) -# radius = math.sqrt(math.pow(ctx_x - center[0], 2) + math.pow(ctx_y - center[1], 2)) -# delta_x0 = (ctx_x - center[0]) -# delta_y0 = (ctx_y - center[1]) -# delta_x1 = (x * SCALE - center[0]) -# delta_y1 = (y * SCALE - center[1]) -# theta0 = math.atan2(delta_y0, delta_x0) -# theta1 = math.atan2(delta_y1, delta_x1) -# # Draw the arc -# ctx.set_source_rgb (*color) -# ctx.set_line_width(self.diameter * SCALE) -# ctx.set_line_cap(cairo.LINE_CAP_ROUND) -# if direction == 'clockwise': -# ctx.arc_negative(center[0], center[1], radius, theta0, theta1) -# else: -# ctx.arc(center[0], center[1], radius, theta0, theta1) -# ctx.stroke() -# -# def flash(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): -# ctx.set_source_rgb (*color) -# ctx.set_line_width(0) -# ctx.arc(x * SCALE, y * SCALE, (self.diameter/2.) * SCALE, 0, 2 * math.pi) -# ctx.fill() -# -#class CairoRect(Rect): -# def line(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): -# ctx.set_source_rgb (*color) -# ctx.set_line_width(self.diameter * SCALE) -# ctx.set_line_cap(cairo.LINE_CAP_SQUARE) -# ctx.line_to(x * SCALE, y * SCALE) -# ctx.stroke() -# -# def flash(self, ctx, x, y, color=(184/255., 115/255., 51/255.)): -# xsize, ysize = self.size -# ctx.set_source_rgb (*color) -# ctx.set_line_width(0) -# x0 = SCALE * (x - (xsize / 2.)) -# y0 = SCALE * (y - (ysize / 2.)) -# -# ctx.rectangle(x0,y0,SCALE * xsize, SCALE * ysize) -# ctx.fill() -# - - class GerberCairoContext(GerberContext): def __init__(self, surface=None, size=(1000, 1000)): GerberContext.__init__(self) if surface is None: - self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, + self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, size[0], size[1]) else: - self.surface = surface + self.surface = surface self.ctx = cairo.Context(self.surface) self.size = size self.ctx.translate(0, self.size[1]) @@ -94,7 +38,7 @@ class GerberCairoContext(GerberContext): self.ctx.scale(1, -1) self.apertures = {} self.background = False - + def set_bounds(self, bounds): xbounds, ybounds = bounds self.ctx.rectangle(SCALE * xbounds[0], SCALE * ybounds[0], SCALE * (xbounds[1]- xbounds[0]), SCALE * (ybounds[1] - ybounds[0])) @@ -144,4 +88,4 @@ class GerberCairoContext(GerberContext): self._render_circle(circle, color) def dump(self, filename): - self.surface.write_to_png(filename) \ No newline at end of file + self.surface.write_to_png(filename) -- cgit