Add SVG transparency

This commit is contained in:
Hamilton Kibbe 2014-10-13 13:26:32 -04:00
parent 6adcdbae5f
commit c50949e15a
2 changed files with 52 additions and 29 deletions

View file

@ -25,11 +25,18 @@ if __name__ == '__main__':
sys.exit(1)
ctx = GerberSvgContext()
ctx.set_alpha(0.95)
for filename in sys.argv[1:]:
print "parsing %s" % filename
if 'GTO' in filename or 'GBO' in filename:
ctx.set_color((1,1,1))
ctx.set_alpha(0.8)
elif 'GTS' in filename or 'GBS' in filename:
ctx.set_color((0.2,0.2,0.75))
ctx.set_alpha(0.8)
gerberfile = read(filename)
gerberfile.render(ctx)
print('Saving image to test.svg')
ctx.dump('test.svg')

View file

@ -28,49 +28,59 @@ def convert_color(color):
return 'rgb(%d, %d, %d)' % color
class SvgCircle(Circle):
def line(self, ctx, x, y, color='rgb(184, 115, 51)'):
return ctx.dwg.line(start=(ctx.x * SCALE, -ctx.y * SCALE),
end=(x * SCALE, -y * SCALE),
stroke=color,
stroke_width=SCALE * self.diameter,
stroke_linecap="round")
def arc(self, ctx, x, y, i, j, direction, color='rgb(184, 115, 51)'):
def line(self, ctx, x, y, color='rgb(184, 115, 51)', alpha=1.0):
aline = ctx.dwg.line(start=(ctx.x * SCALE, -ctx.y * SCALE),
end=(x * SCALE, -y * SCALE),
stroke=color,
stroke_width=SCALE * self.diameter,
stroke_linecap="round")
aline.stroke(opacity=alpha)
return aline
def arc(self, ctx, x, y, i, j, direction, color='rgb(184, 115, 51)', alpha=1.0):
pass
def flash(self, ctx, x, y, color='rgb(184, 115, 51)'):
return [ctx.dwg.circle(center=(x * SCALE, -y * SCALE),
def flash(self, ctx, x, y, color='rgb(184, 115, 51)', alpha=1.0):
circle = ctx.dwg.circle(center=(x * SCALE, -y * SCALE),
r = SCALE * (self.diameter / 2.0),
fill=color), ]
fill=color)
circle.fill(opacity=alpha)
return [circle, ]
class SvgRect(Rect):
def line(self, ctx, x, y, color='rgb(184, 115, 51)'):
return ctx.dwg.line(start=(ctx.x * SCALE, -ctx.y * SCALE),
def line(self, ctx, x, y, color='rgb(184, 115, 51)', alpha=1.0):
aline = ctx.dwg.line(start=(ctx.x * SCALE, -ctx.y * SCALE),
end=(x * SCALE, -y * SCALE),
stroke=color, stroke_width=2,
stroke_linecap="butt")
aline.stroke(opacity=alpha)
return aline
def flash(self, ctx, x, y, color='rgb(184, 115, 51)'):
def flash(self, ctx, x, y, color='rgb(184, 115, 51)', alpha=1.0):
xsize, ysize = self.size
return [ctx.dwg.rect(insert=(SCALE * (x - (xsize / 2)),
rectangle = ctx.dwg.rect(insert=(SCALE * (x - (xsize / 2)),
-SCALE * (y + (ysize / 2))),
size=(SCALE * xsize, SCALE * ysize),
fill=color), ]
fill=color)
rectangle.fill(opacity=alpha)
return [rectangle, ]
class SvgObround(Obround):
def line(self, ctx, x, y, color='rgb(184, 115, 51)'):
def line(self, ctx, x, y, color='rgb(184, 115, 51)', alpha=1.0):
pass
def flash(self, ctx, x, y, color='rgb(184, 115, 51)'):
def flash(self, ctx, x, y, color='rgb(184, 115, 51)', alpha=1.0):
xsize, ysize = self.size
# horizontal obround
if xsize == ysize:
return [ctx.dwg.circle(center=(x * SCALE, -y * SCALE),
circle = ctx.dwg.circle(center=(x * SCALE, -y * SCALE),
r = SCALE * (x / 2.0),
fill=color), ]
fill=color)
circle.fill(opacity=alpha)
return [circle, ]
if xsize > ysize:
rectx = xsize - ysize
recty = ysize
@ -88,6 +98,9 @@ class SvgObround(Obround):
-SCALE * (y + (ysize / 2.))),
size=(SCALE * xsize, SCALE * ysize),
fill=color)
lcircle.fill(opacity=alpha)
rcircle.fill(opacity=alpha)
rect.fill(opacity=alpha)
return [lcircle, rcircle, rect, ]
# Vertical obround
@ -108,6 +121,9 @@ class SvgObround(Obround):
-SCALE * (y + (ysize / 2.))),
size=(SCALE * xsize, SCALE * ysize),
fill=color)
lcircle.fill(opacity=alpha)
ucircle.fill(opacity=alpha)
rect.fill(opacity=alpha)
return [lcircle, ucircle, rect, ]
@ -131,11 +147,6 @@ class GerberSvgContext(GerberContext):
size=size, fill=convert_color(self.background_color)))
self.background = True
def set_alpha(self, alpha):
super(GerberSvgContext, self).set_alpha(alpha)
import warnings
warnings.warn('SVG output does not support transparency')
def define_aperture(self, d, shape, modifiers):
aperture = None
if shape == 'C':
@ -162,7 +173,8 @@ class GerberSvgContext(GerberContext):
return
color = (convert_color(self.color) if self.level_polarity == 'dark'
else convert_color(self.background_color))
self.dwg.add(ap.line(self, x, y, color))
alpha = self.alpha if self.level_polarity == 'dark' else 1.0
self.dwg.add(ap.line(self, x, y, color, alpha))
self.move(x, y, resolve=False)
def arc(self, x, y, i, j):
@ -172,7 +184,7 @@ class GerberSvgContext(GerberContext):
if ap is None:
return
#self.dwg.add(ap.arc(self, x, y, i, j, self.direction,
# convert_color(self.color)))
# convert_color(self.color), self.alpha))
self.move(x, y, resolve=False)
def flash(self, x, y):
@ -184,7 +196,8 @@ class GerberSvgContext(GerberContext):
color = (convert_color(self.color) if self.level_polarity == 'dark'
else convert_color(self.background_color))
for shape in ap.flash(self, x, y, color):
alpha = self.alpha if self.level_polarity == 'dark' else 1.0
for shape in ap.flash(self, x, y, color, alpha):
self.dwg.add(shape)
self.move(x, y, resolve=False)
@ -192,6 +205,7 @@ class GerberSvgContext(GerberContext):
hit = self.dwg.circle(center=(x*SCALE, -y*SCALE),
r=SCALE*(diameter/2.0),
fill=convert_color(self.drill_color))
#hit.fill(opacity=self.alpha)
self.dwg.add(hit)
def region_contour(self, x, y):
@ -199,10 +213,12 @@ class GerberSvgContext(GerberContext):
x, y = self.resolve(x, y)
color = (convert_color(self.color) if self.level_polarity == 'dark'
else convert_color(self.background_color))
alpha = self.alpha if self.level_polarity == 'dark' else 1.0
if self.region_path is None:
self.region_path = self.dwg.path(d = 'M %f, %f' %
(self.x*SCALE, -self.y*SCALE),
fill = color, stroke = 'none')
self.region_path.fill(opacity=alpha)
self.region_path.push('L %f, %f' % (x*SCALE, -y*SCALE))
self.move(x, y, resolve=False)