def _draw_background(self): # Draw node groups. for group in self.groups: if group.shape == 'box': box = self.metrics.group(group).marginbox if group.href and self.format == 'SVG': drawer = self.drawer.anchor(group.href) else: drawer = self.drawer drawer.rectangle(box, fill=group.color, filter='blur') # Drop node shadows. for node in self.nodes: if node.color != 'none' and self.diagram.shadow_style != 'none': r = noderenderer.get(node.shape) shape = r(node, self.metrics) if node.href and self.format == 'SVG': drawer = self.drawer.anchor(node.href) else: drawer = self.drawer shape.render(drawer, self.format, fill=self.shadow, shadow=True, style=self.diagram.shadow_style)
def node(self, node): renderer = noderenderer.get(node.shape) if hasattr(renderer, 'render'): return renderer(node, self) else: return self.cell(node)
def node(self, node, **kwargs): r = noderenderer.get(node.shape) shape = r(node, self.metrics) if node.href and self.format == 'SVG': drawer = self.drawer.anchor(node.href) else: drawer = self.drawer shape.render(drawer, self.format, fill=self.fill, badgeFill=self.badgeFill)
def set_default_shape(self, value): if noderenderer.get(value): DiagramNode.set_default_shape(value) else: msg = "unknown node shape: %s" % value raise AttributeError(msg)
def set_shape(self, value): if noderenderer.get(value): self.shape = value else: msg = "unknown node shape: %s" % value raise AttributeError(msg)
def draw_diagram(string_commands): #output_formatv = "svg" #or svg, default_shadow_color = (255, 255, 255) # RGB white default_nodeline_color = (255, 255, 255) # RGB white size=None graph_string = string_commands tree = parser.parse_string(graph_string) diagram = blockdiag.builder.ScreenNodeBuilder.build(tree, None) diagram.separated=True diagram.set_color('red') diagram.set_orientation('portrait') diagram.set_default_linecolor(default_nodeline_color) fontmap = blockdiag.utils.fontmap.FontMap() font_loc = '/home/alireza/group-diagrams/Notebooks/Fonts/georgia.ttf' fontmap.set_default_font(path = font_loc) metrics = DiagramMetrics(diagram=diagram, drawer=None, fontmap=fontmap) #fontmap.set_default_fontfamily(fontfamily='serif-bold') #fontmap.set_default_fontfamily(fontfamily='serif') fontmap.fontsize =10 #fontmap = _create_fontmap(fontmap=None, font=None) drawer = blockdiag.drawer.DiagramDraw(_format='svg', diagram=diagram, fontmap=fontmap, code=graph_string, antialias=True, nodoctype=False, transparency=False) drawer.shadow = default_shadow_color drawer.draw() svg = drawer.save() svg2png(bytestring = svg, write_to='/home/XXX/group-diagrams/Notebooks/output2.png',scale=4) #img = Image.open(io.BytesIO(res)) img = Image.open('/home/XXX/group-diagrams/Notebooks/output2.png') nodes_coordinates=[] nodes_ids=[] for node in drawer.nodes: r = noderenderer.get(node.shape) shape = r(node, metrics) box = metrics.cell(node).box nodes_coordinates.append([box.topleft, box.bottomright, box.width, box.height, box.center, (box.center[0],box.center[1]-int(box.height/2)), ]) nodes_ids.append(int(node.id)) if int(node.id)==9: NODE=node nodes_info = pd.DataFrame(nodes_coordinates,index=nodes_ids,columns=['top_left', 'bottom_right', 'width', 'height', 'center','top_center']) nodes_info.index.name='node id' for node_id in input_df.index: if input_df.at[node_id,'node_flag']: flag_img = Image.open('country-flags-master/png100px/' +input_df.at[node_id,'node_flag'] +'.png', 'r') flag_img.thumbnail((100,100), Image.ANTIALIAS) # resizing the flag img.paste(flag_img, (nodes_info.at[node_id, 'bottom_right'][0]*4-50, nodes_info.at[node_id, 'bottom_right'][1]*4-30)) draw = ImageDraw.Draw(img) for node_id in input_df.index: if input_df.at[node_id,'edge_label']: for child_id, edge_label in zip(input_df.at[node_id,'directed_to'], input_df.at[node_id,'edge_label']): draw.text((nodes_info.at[child_id, 'top_center'][0]*4+25, nodes_info.at[child_id, 'top_center'][1]*4-50), edge_label, (0,0,0), font=ImageFont.truetype(font_loc, 40)) return img, svg, nodes_info
drawer.shadow = default_shadow_color drawer.draw() res = drawer.save() if output_formatv == "png": img = Image.open(io.BytesIO(res)) img # Getting the coordinates of the boxes which can be used for pasting, for example, flag images on the output pillow image: # In[10]: nodes_coordinates = [] nodes_ids = [] for node in drawer.nodes: r = noderenderer.get(node.shape) shape = r(node, metrics) box = metrics.cell(node).box nodes_coordinates.append( [box.topleft, box.bottomright, box.width, box.height, box.center]) nodes_ids.append(int(node.id)) if int(node.id) == 9: NODE = node nodes_info = pd.DataFrame( nodes_coordinates, index=nodes_ids, columns=['top_left', 'bottom_right', 'width', 'height', 'center']) nodes_info.index.name = 'node id' nodes_info # Getting the coordinates information of the edges: