Exemple #1
0
    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)
Exemple #2
0
    def node(self, node):
        renderer = noderenderer.get(node.shape)

        if hasattr(renderer, 'render'):
            return renderer(node, self)
        else:
            return self.cell(node)
Exemple #3
0
    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)
Exemple #4
0
    def node(self, node):
        renderer = noderenderer.get(node.shape)

        if hasattr(renderer, 'render'):
            return renderer(node, self)
        else:
            return self.cell(node)
Exemple #5
0
    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)
Exemple #6
0
    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)
Exemple #7
0
 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)
Exemple #8
0
 def set_shape(self, value):
     if noderenderer.get(value):
         self.shape = value
     else:
         msg = "unknown node shape: %s" % value
         raise AttributeError(msg)
Exemple #9
0
 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)
Exemple #10
0
 def set_shape(self, value):
     if noderenderer.get(value):
         self.shape = value
     else:
         msg = "unknown node shape: %s" % value
         raise AttributeError(msg)
Exemple #11
0
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
Exemple #12
0
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: