Fix hard requirement of cairo per #83, and add stubs for required subclass methods to GerberContext per #84

This commit is contained in:
Hamilton Kibbe 2018-06-05 08:57:37 -04:00
parent 31062ba2ce
commit 5245fb9256
8 changed files with 90 additions and 69 deletions

View file

@ -25,7 +25,8 @@ a .png file.
import os
from gerber import load_layer
from gerber.render import GerberCairoContext, RenderSettings, theme
from gerber.render import RenderSettings, theme
from gerber.render.cairo_backend import GerberCairoContext
GERBER_FOLDER = os.path.abspath(os.path.join(os.path.dirname(__file__), 'gerbers'))

View file

@ -22,7 +22,8 @@ images using the PCB interface
import os
from gerber import PCB
from gerber.render import GerberCairoContext, theme
from gerber.render import theme
from gerber.render.cairo_backend import GerberCairoContext
GERBER_FOLDER = os.path.abspath(os.path.join(os.path.dirname(__file__), 'gerbers'))

View file

@ -250,6 +250,10 @@ class CamFile(object):
"""
pass
@property
def bounding_box(self):
pass
def to_inch(self):
pass
@ -271,12 +275,12 @@ class CamFile(object):
from .render import GerberCairoContext
ctx = GerberCairoContext()
ctx.set_bounds(self.bounding_box)
ctx._paint_background()
ctx.paint_background()
ctx.invert = invert
ctx._new_render_layer()
ctx.new_render_layer()
for p in self.primitives:
ctx.render(p)
ctx._flatten()
ctx.flatten()
if filename is not None:
ctx.dump(filename)

View file

@ -23,6 +23,4 @@ This module provides contexts for rendering images of gerber layers. Currently
SVG is the only supported format.
"""
from .cairo_backend import GerberCairoContext
from .render import RenderSettings

View file

@ -91,7 +91,7 @@ class GerberCairoContext(GerberContext):
self.set_bounds(bounds)
else:
self.set_bounds(layer.bounds)
self._paint_background(bgsettings)
self.paint_background(bgsettings)
if verbose:
print('[Render]: Rendering {} Layer.'.format(layer.layer_class))
self._render_count += 1
@ -193,11 +193,11 @@ class GerberCairoContext(GerberContext):
def _render_layer(self, layer, settings):
self.invert = settings.invert
# Get a new clean layer to render on
self._new_render_layer(mirror=settings.mirror)
self.new_render_layer(mirror=settings.mirror)
for prim in layer.primitives:
self.render(prim)
# Add layer to image
self._flatten(settings.color, settings.alpha)
self.flatten(settings.color, settings.alpha)
def _render_line(self, line, color):
start = self.scale_point(line.start)
@ -530,7 +530,7 @@ class GerberCairoContext(GerberContext):
self.ctx.show_text(primitive.net_name)
self.ctx.scale(1, -1)
def _new_render_layer(self, color=None, mirror=False):
def new_render_layer(self, color=None, mirror=False):
size_in_pixels = self.scale_point(self.size_in_inch)
matrix = copy.copy(self._xform_matrix)
layer = cairo.SVGSurface(None, size_in_pixels[0], size_in_pixels[1])
@ -548,8 +548,7 @@ class GerberCairoContext(GerberContext):
self.active_layer = layer
self.active_matrix = matrix
def _flatten(self, color=None, alpha=None):
def flatten(self, color=None, alpha=None):
color = color if color is not None else self.color
alpha = alpha if alpha is not None else self.alpha
self.output_ctx.set_source_rgba(color[0], color[1], color[2], alpha)
@ -558,7 +557,7 @@ class GerberCairoContext(GerberContext):
self.active_layer = None
self.active_matrix = None
def _paint_background(self, settings=None):
def paint_background(self, settings=None):
color = settings.color if settings is not None else self.background_color
alpha = settings.alpha if settings is not None else 1.0
if not self.has_bg:

View file

@ -63,10 +63,10 @@ class ExcellonContext(GerberContext):
def statements(self):
return self.start + self.comments + self.header + self.body_start + self.body + self._get_end()
def set_bounds(self, bounds):
def set_bounds(self, bounds, *args, **kwargs):
pass
def _paint_background(self):
def paint_background(self):
pass
def _render_line(self, line, color):
@ -186,4 +186,3 @@ class ExcellonContext(GerberContext):
def _render_inverted_layer(self):
pass

View file

@ -139,7 +139,7 @@ class GerberContext(object):
if not primitive:
return
self._pre_render_primitive(primitive)
self.pre_render_primitive(primitive)
color = self.color
if isinstance(primitive, Line):
@ -167,16 +167,35 @@ class GerberContext(object):
elif isinstance(primitive, TestRecord):
self._render_test_record(primitive, color)
self._post_render_primitive(primitive)
self.post_render_primitive(primitive)
def _pre_render_primitive(self, primitive):
def set_bounds(self, bounds, *args, **kwargs):
"""Called by the renderer to set the extents of the file to render.
Parameters
----------
bounds: Tuple[Tuple[float, float], Tuple[float, float]]
( (x_min, x_max), (y_min, y_max)
"""
pass
def paint_background(self):
pass
def new_render_layer(self):
pass
def flatten(self):
pass
def pre_render_primitive(self, primitive):
"""
Called before rendering a primitive. Use the callback to perform some action before rendering
a primitive, for example adding a comment.
"""
return
def _post_render_primitive(self, primitive):
def post_render_primitive(self, primitive):
"""
Called after rendering a primitive. Use the callback to perform some action after rendering
a primitive

View file

@ -148,10 +148,10 @@ class Rs274xContext(GerberContext):
def statements(self):
return self.comments + self.header + self.body + self.end
def set_bounds(self, bounds):
def set_bounds(self, bounds, *args, **kwargs):
pass
def _paint_background(self):
def paint_background(self):
pass
def _select_aperture(self, aperture):
@ -173,7 +173,7 @@ class Rs274xContext(GerberContext):
self.body.append(ApertureStmt(aper.d))
self._dcode = aper.d
def _pre_render_primitive(self, primitive):
def pre_render_primitive(self, primitive):
if hasattr(primitive, 'comment'):
self.body.append(CommentStmt(primitive.comment))
@ -489,11 +489,11 @@ class Rs274xContext(GerberContext):
def _render_inverted_layer(self):
pass
def _new_render_layer(self):
def new_render_layer(self):
# TODO Might need to implement this
pass
def _flatten(self):
def flatten(self):
# TODO Might need to implement this
pass