def arc(self, box, start, end, **kwargs): fill = kwargs.get('fill') w = box.width / 2 h = box.height / 2 if start > end: end += 360 endpoints = ellipse_endpoints(1, w, h, start, end) pt1 = XY(box.x + w + round(endpoints[0].x, 0), box.y + h + round(endpoints[0].y, 0)) pt2 = XY(box.x + w + round(endpoints[1].x, 0), box.y + h + round(endpoints[1].y, 0)) if end - start > 180: largearc = 1 else: largearc = 0 pd = pathdata(pt1[0], pt1[1]) pd.ellarc(w, h, 0, largearc, 1, pt2[0], pt2[1]) p = path(pd, fill="none", stroke=rgb(fill), **drawing_params(kwargs)) self.svg.addElement(p)
def render_vector_shape(self, drawer, _, **kwargs): fill = kwargs.get('fill') # create pathdata m = self.metrics.cell(self.node) r = self.metrics.cellsize * 2 height = self.metrics.node_height box = Box(m.topleft.x + r, m.topleft.y, m.bottomright.x - r, m.bottomright.y) if kwargs.get('shadow'): box = self.shift_shadow(box) path = pathdata(box[0], box[1]) path.line(box[2], box[1]) path.ellarc(r, height / 2, 0, 0, 1, box[2], box[3]) path.line(box[0], box[3]) path.ellarc(r, height / 2, 0, 0, 1, box[0], box[1]) # draw outline if kwargs.get('shadow'): if kwargs.get('style') == 'blur': drawer.path(path, fill=fill, outline=fill, filter='transp-blur') else: drawer.path(path, fill=fill, outline=fill) elif self.node.background: drawer.path(path, fill=self.node.color, outline=self.node.color) drawer.image(self.textbox, self.node.background) drawer.path(path, fill="none", outline=self.node.linecolor, style=self.node.style) else: drawer.path(path, fill=self.node.color, outline=self.node.linecolor, style=self.node.style)
def render_vector_shape(self, drawer, _, **kwargs): fill = kwargs.get('fill') # create pathdata box = self.metrics.cell(self.node).box r = self.metrics.cellsize if kwargs.get('shadow'): box = self.shift_shadow(box) path = pathdata(box[0] + r, box[1]) path.line(box[2] - r, box[1]) path.ellarc(r, r, 0, 0, 1, box[2], box[1] + r) path.line(box[2], box[3] - r) path.ellarc(r, r, 0, 0, 1, box[2] - r, box[3]) path.line(box[0] + r, box[3]) path.ellarc(r, r, 0, 0, 1, box[0], box[3] - r) path.line(box[0], box[1] + r) path.ellarc(r, r, 0, 0, 1, box[0] + r, box[1]) # draw outline if kwargs.get('shadow'): if kwargs.get('style') == 'blur': drawer.path(path, fill=fill, outline=fill, filter='transp-blur') else: drawer.path(path, fill=fill, outline=fill) elif self.node.background: drawer.path(path, fill=self.node.color, outline=self.node.color) drawer.image(self.textbox, self.node.background) drawer.path(path, fill="none", outline=self.node.linecolor, style=self.node.style) else: drawer.path(path, fill=self.node.color, outline=self.node.linecolor, style=self.node.style)
def render_vector_shape(self, drawer, _, **kwargs): fill = kwargs.get('fill') m = self.metrics.cell(self.node) r = self.metrics.cellsize width = self.metrics.node_width box = m.box if kwargs.get('shadow'): box = self.shift_shadow(box) path = pathdata(box[0], box[1] + r) path.ellarc(width // 2, r, 0, 0, 1, box[2], box[1] + r) path.line(box[2], box[3] - r) path.ellarc(width // 2, r, 0, 0, 1, box[0], box[3] - r) path.line(box[0], box[1] + r) # draw outline if kwargs.get('shadow'): if kwargs.get('style') == 'blur': drawer.path(path, fill=fill, outline=fill, filter='transp-blur') else: drawer.path(path, fill=fill, outline=fill) elif self.node.background: drawer.path(path, fill=self.node.color, outline=self.node.color) drawer.image(self.textbox, self.node.background) drawer.path(path, fill="none", outline=self.node.linecolor, style=self.node.style) else: drawer.path(path, fill=self.node.color, outline=self.node.linecolor, style=self.node.style) # draw cap of cylinder if not kwargs.get('shadow'): path = pathdata(box[2], box[1] + r) path.ellarc(width // 2, r, 0, 0, 1, box[0], box[1] + r) drawer.path(path, fill=self.node.color, outline=self.node.linecolor, style=self.node.style)
def line(self, points, **kwargs): fill = kwargs.get("fill") thick = kwargs.get("thick") pd = pathdata(points[0].x, points[0].y) for pt in points[1:]: pd.line(pt.x, pt.y) p = path(pd, fill="none", stroke=rgb(fill), stroke_width=thick, **drawing_params(kwargs)) self.svg.addElement(p)
def line(self, points, **kwargs): fill = kwargs.get('fill') thick = kwargs.get('thick') pd = pathdata(points[0].x, points[0].y) for pt in points[1:]: pd.line(pt.x, pt.y) p = path(pd, fill="none", stroke=rgb(fill), stroke_width=thick, **drawing_params(kwargs)) self.svg.addElement(p)
def render_shape(self, drawer, format, **kwargs): super(QB, self).render_shape(drawer, format, **kwargs) outline = kwargs.get('outline') fill = kwargs.get('fill') # draw outline if not kwargs.get('shadow'): m = self.metrics h = m.node_height / 4 w = m.node_width / 6 r = m.cellsize # left eye xy = self.metrics.cell(self.node).top left = XY(xy.x - w, xy.y + h) self.render_eye(drawer, left) # right eye right = XY(xy.x + w, xy.y + h) self.render_eye(drawer, right) # left mouthline xy = self.metrics.cell(self.node).bottom y = xy.y - h * 3 / 2 + r / 2 if w > r * 3: rx = r * 3 ry = r * 3 / 4 else: rx = w - r ry = r / 2 if format == 'SVG': path = pathdata(xy.x - rx, y) path.ellarc(rx / 2, ry, 0, 0, 0, xy.x, y) path.ellarc(rx / 2, ry, 0, 0, 0, xy.x + rx, y) drawer.path(path, fill="none", outline=fill) else: box = (xy.x - rx, y - ry, xy.x, y + ry) drawer.arc(box, 0, 180, fill=fill) box = (xy.x, y - ry, xy.x + rx, y + ry) drawer.arc(box, 0, 180, fill=fill)
def render_vector_shape(self, drawer, _, **kwargs): fill = kwargs.get('fill') # create pathdata m = self.metrics.cell(self.node) rx = (self.node.width or self.metrics.node_width) // 12 ry = (self.node.height or self.metrics.node_height) // 5 pt = m.topleft if kwargs.get('shadow'): pt = self.shift_shadow(pt) path = pathdata(pt.x + rx * 2, pt.y + ry * 2) path.ellarc(rx * 2, ry, 0, 0, 1, pt.x + rx * 4, pt.y + ry) path.ellarc(rx * 2, ry * 3 // 4, 0, 0, 1, pt.x + rx * 9, pt.y + ry) path.ellarc(rx * 2, ry, 0, 0, 1, pt.x + rx * 11, pt.y + ry * 2) path.ellarc(rx * 2, ry, 0, 0, 1, pt.x + rx * 11, pt.y + ry * 4) path.ellarc(rx * 2, ry * 5 // 2, 0, 0, 1, pt.x + rx * 8, pt.y + ry * 4) path.ellarc(rx * 2, ry * 5 // 2, 0, 0, 1, pt.x + rx * 5, pt.y + ry * 4) path.ellarc(rx * 2, ry * 5 // 2, 0, 0, 1, pt.x + rx * 2, pt.y + ry * 4) path.ellarc(rx * 2, ry, 0, 0, 1, pt.x + rx * 2, pt.y + ry * 2) # draw outline if kwargs.get('shadow'): if kwargs.get('style') == 'blur': drawer.path(path, fill=fill, outline=fill, filter='transp-blur') else: drawer.path(path, fill=fill, outline=fill) elif self.node.background: drawer.path(path, fill=self.node.color, outline=self.node.color) drawer.image(self.textbox, self.node.background) drawer.path(path, fill="none", outline=self.node.linecolor, style=self.node.style) else: drawer.path(path, fill=self.node.color, outline=self.node.linecolor, style=self.node.style)
def trunkline(self, network, shadow=False): metrics = self.metrics m = metrics.network(network) r = metrics.trunk_diameter // 2 pt1, pt2 = m.trunkline box = Box(pt1.x, pt1.y - r, pt2.x, pt2.y + r) if shadow: xdiff = self.metrics.shadow_offset.x ydiff = self.metrics.shadow_offset.y // 2 box = Box(pt1.x + xdiff, pt1.y - r + ydiff, pt2.x + xdiff, pt2.y + r + ydiff) if self.format == 'SVG': from blockdiag.imagedraw.simplesvg import pathdata path = pathdata(box[0], box[1]) path.line(box[2], box[1]) path.ellarc(r // 2, r, 0, 0, 1, box[2], box[3]) path.line(box[0], box[3]) path.ellarc(r // 2, r, 0, 0, 1, box[0], box[1]) if shadow: self.drawer.path(path, fill=self.shadow, filter='blur') else: self.drawer.path(path, fill=network.color, outline=network.linecolor) path = pathdata(box[2], box[3]) path.ellarc(r // 2, r, 0, 0, 1, box[2], box[1]) self.drawer.path(path, fill='none', outline=network.linecolor) # for edge jumping line = (XY(box[0], box[1]), XY(box[2], box[1])) self.drawer.line(line, fill='none', jump=True) else: lsection = Box(box[0] - r // 2, box[1], box[0] + r // 2, box[3]) rsection = Box(box[2] - r // 2, box[1], box[2] + r // 2, box[3]) if shadow: color = self.shadow _filter = 'blur' else: color = network.color _filter = None # fill background self.drawer.rectangle(box, outline=color, fill=color, filter=_filter) self.drawer.ellipse(lsection, outline=color, fill=color, filter=_filter) self.drawer.ellipse(rsection, outline=color, fill=color, filter=_filter) if not shadow: upper = (XY(box[0], box[1]), XY(box[2], box[1])) self.drawer.line(upper, fill=network.linecolor, jump=True) bottom = (XY(box[0], box[3]), XY(box[2], box[3])) self.drawer.line(bottom, fill=network.linecolor, jump=True) self.drawer.arc(lsection, 90, 270, fill=network.linecolor) self.drawer.ellipse(rsection, outline=network.linecolor, fill=network.color)