Fix hard requirement of cairo per #83, and add stubs for required subclass methods to GerberContext per #84
This commit is contained in:
parent
31062ba2ce
commit
5245fb9256
8 changed files with 90 additions and 69 deletions
|
|
@ -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'))
|
||||
|
||||
|
|
|
|||
|
|
@ -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'))
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue