Drawing.render, Drawing.remove_paths_outside
This commit is contained in:
parent
49ca131ad3
commit
2daaf8ec93
|
@ -4,6 +4,11 @@ from math import sin, cos, radians
|
||||||
|
|
||||||
from .paths import simplify_paths, sort_paths, join_paths
|
from .paths import simplify_paths, sort_paths, join_paths
|
||||||
|
|
||||||
|
try:
|
||||||
|
import cairo
|
||||||
|
except ImportError:
|
||||||
|
cairo = None
|
||||||
|
|
||||||
class Drawing(object):
|
class Drawing(object):
|
||||||
def __init__(self, paths=None):
|
def __init__(self, paths=None):
|
||||||
self.paths = paths or []
|
self.paths = paths or []
|
||||||
|
@ -100,3 +105,46 @@ class Drawing(object):
|
||||||
drawings.append((scale, drawing))
|
drawings.append((scale, drawing))
|
||||||
scale, drawing = max(drawings)
|
scale, drawing = max(drawings)
|
||||||
return drawing.scale(scale, scale).center(width, height)
|
return drawing.scale(scale, scale).center(width, height)
|
||||||
|
|
||||||
|
def remove_paths_outside(self, width, height):
|
||||||
|
paths = []
|
||||||
|
for path in self.paths:
|
||||||
|
ok = True
|
||||||
|
for x, y in path:
|
||||||
|
if x < 0 or y < 0 or x > width or y > height:
|
||||||
|
ok = False
|
||||||
|
break
|
||||||
|
if ok:
|
||||||
|
paths.append(path)
|
||||||
|
return Drawing(paths)
|
||||||
|
|
||||||
|
def render(self, scale=96, margin=30, line_width=0.5/25.4):
|
||||||
|
if cairo is None:
|
||||||
|
raise Exception('Drawing.render() requires cairo')
|
||||||
|
# x1, y1, x2, y2 = self.bounds
|
||||||
|
x1, y1, x2, y2 = (0, 0, 11, 8.5)
|
||||||
|
w = x2 - x1
|
||||||
|
h = y2 - y1
|
||||||
|
width = int(scale * w + margin * 2)
|
||||||
|
height = int(scale * h + margin * 2)
|
||||||
|
surface = cairo.ImageSurface(cairo.FORMAT_RGB24, width, height)
|
||||||
|
dc = cairo.Context(surface)
|
||||||
|
dc.set_line_cap(cairo.LINE_CAP_ROUND)
|
||||||
|
dc.set_line_join(cairo.LINE_JOIN_ROUND)
|
||||||
|
dc.translate(margin, margin)
|
||||||
|
dc.scale(scale, scale)
|
||||||
|
dc.translate(-x1, -y1)
|
||||||
|
dc.set_source_rgb(1, 1, 1)
|
||||||
|
dc.paint()
|
||||||
|
dc.set_source_rgb(0.5, 0.5, 0.5)
|
||||||
|
dc.set_line_width(1 / scale)
|
||||||
|
dc.rectangle(x1, y1, w, h)
|
||||||
|
dc.stroke()
|
||||||
|
dc.set_source_rgb(0, 0, 0)
|
||||||
|
dc.set_line_width(line_width)
|
||||||
|
for path in self.paths:
|
||||||
|
dc.move_to(*path[0])
|
||||||
|
for x, y in path:
|
||||||
|
dc.line_to(x, y)
|
||||||
|
dc.stroke()
|
||||||
|
return surface
|
||||||
|
|
Loading…
Reference in New Issue