Source code for podspy.utils.layout

#!/usr/bin/env python

"""This is the layout utils module.

This module contains useful methods related to layout
"""


import logging


logger = logging.getLogger(__file__)


[docs]def get_layout_ele(element, layout, default=None): l_element = default # either node or edge if layout.get_node(element): l_element = layout.get_node(element) elif layout.get_edge(element.src, element.target, key=element): l_element = layout.get_edge(element.src, element.target, key=element) return l_element
[docs]def get_width(element, layout, default=0.): if element is None or layout is None: return default l_element = get_layout_ele(element, layout) if l_element and 'width' in l_element.attr: try: width = float(l_element.attr['width']) except Exception as e: logger.error(e) width = default else: width = default return width
[docs]def get_height(element, layout, default=0.): if element is None or layout is None: return default l_element = get_layout_ele(element, layout) if l_element and 'height' in l_element.attr: try: height = float(l_element.attr['height']) except Exception as e: logger.error(e) height = default else: height = default return height
[docs]def get_node_pos(element, layout, default=(10., 10.)): if element is None or layout is None: return default l_element = layout.get_node(element) if 'pos' in l_element.attr: pos = tuple(map(float, l_element.attr['pos'].split(','))) else: pos = default return pos
[docs]def get_edge_points(element, layout): points = [] if element is None or layout is None: return points l_element = layout.get_edge(element.src, element.target, key=element) if 'pos' in l_element.attr: # check out: https://graphviz.gitlab.io/_pages/doc/info/attrs.html#k:splineType pos_str = l_element.attr['pos'].split(' ') start_x, start_y = None, None end_x, end_y = None, None if 'e' in pos_str[0]: # edge end point is given end_x, end_y = pos_str[0].split(',')[1:] pos_str = pos_str[1:] if len(pos_str) > 0 and 's' in pos_str[0]: start_x, start_y = pos_str[0].split(',')[1:] pos_str = pos_str[1:] # the rest of the edge points for pos_i in pos_str: x, y = pos_i.split(',') points = points + [(x, y), ] # add back start and end points if end_x and end_y: points = points + [(end_x, end_y), ] if start_x and start_y: points = [(start_x, start_y), ] + points # converting everything to floats has_err = False for i in range(len(points)): point_i = points[i] try: points[i] = (float(point_i[0]), float(point_i[1])) except Exception as e: logger.error('Convert {} as float: {}'.format(point_i, e)) has_err = True # default to empty list with error if has_err: points = [] return points