def init_items(root_node, parent, n2i, n2f, img, rot_step, hide_root): # ::: Precalculate values ::: visited = set() to_visit = [] to_visit.append(root_node) last_rotation = img.arc_start depth = 1 while to_visit: node = to_visit[-1] finished = True if node not in n2i: # Set style according to layout function item = n2i[node] = _NodeItem(node, parent.tree_layer) depth += 1 item.setZValue(depth) if node is root_node and hide_root: pass else: init_node_dimensions(node, item, n2f[node], img) #set_node_size(node, n2i, n2f, img) if not _leaf(node): # visit children starting from left to right. Very # important!! check all children[-1] and children[0] for c in reversed(node.children): if c not in visited: to_visit.append(c) finished = False # :: pre-order code here :: if not finished: continue else: to_visit.pop(-1) visited.add(node) # :: Post-order visits. Leaves are already visited here :: if img.mode == "c": if _leaf(node): crender.init_circular_leaf_item(node, n2i, n2f, last_rotation, rot_step) last_rotation += rot_step else: crender.init_circular_node_item(node, n2i, n2f) elif img.mode == "r": if _leaf(node): rrender.init_rect_leaf_item(node, n2i, n2f) else: rrender.init_rect_node_item(node, n2i, n2f)
def render(root_node, img, hide_root=False): mode = img.mode orientation = img.orientation if not img.scale and img.tree_width: fnode, max_dist = root_node.get_farthest_leaf(topology_only=\ img.force_topology) if max_dist>0: img.scale = img.tree_width / max_dist else: img.scale = 1 scale = img.scale arc_span = img.arc_span last_rotation = img.arc_start layout_fn = img._layout_handler parent = _TreeItem() n2i = parent.n2i # node to items n2f = parent.n2f # node to faces parent.bg_layer = _EmptyItem(parent) parent.tree_layer = _EmptyItem(parent) parent.float_layer = _EmptyItem(parent) parent.float_behind_layer = _EmptyItem(parent) TREE_LAYERS = [parent.bg_layer, parent.tree_layer, parent.float_layer] parent.bg_layer.setZValue(0) parent.tree_layer.setZValue(2) parent.float_behind_layer.setZValue(1) parent.float_layer.setZValue(3) visited = set() to_visit = [] to_visit.append(root_node) # This could be used to handle aligned faces in internal # nodes. virtual_leaves = 0 if img.show_branch_length: bl_face = faces.AttrFace("dist", fsize=8, ftype="Arial", fgcolor="black", formatter = "%0.3g") if img.show_branch_support: su_face = faces.AttrFace("support", fsize=8, ftype="Arial", fgcolor="darkred", formatter = "%0.3g") if img.show_leaf_name: na_face = faces.AttrFace("name", fsize=10, ftype="Arial", fgcolor="black") for n in root_node.traverse(): set_style(n, layout_fn) if img.show_branch_length: faces.add_face_to_node(bl_face, n, 0, position="branch-top") if not _leaf(n) and img.show_branch_support: faces.add_face_to_node(su_face, n, 0, position="branch-bottom") if _leaf(n) and img.show_leaf_name: faces.add_face_to_node(na_face, n, 0, position="branch-right") if _leaf(n):# or len(n.img_style["_faces"]["aligned"]): virtual_leaves += 1 rot_step = float(arc_span) / virtual_leaves #rot_step = float(arc_span) / len([n for n in root_node.traverse() if _leaf(n)]) # ::: Precalculate values ::: depth = 1 while to_visit: node = to_visit[-1] finished = True if node not in n2i: # Set style according to layout function item = n2i[node] = _NodeItem(node, parent.tree_layer) item.setZValue(depth) depth += 1 if node is root_node and hide_root: pass else: set_node_size(node, n2i, n2f, img) if not _leaf(node): # visit children starting from left most to right # most. Very important!! check all children[-1] and # children[0] for c in reversed(node.children): if c not in visited: to_visit.append(c) finished = False # :: pre-order code here :: if not finished: continue else: to_visit.pop(-1) visited.add(node) # :: Post-order visits. Leaves are already visited here :: if mode == "c": if _leaf(node): crender.init_circular_leaf_item(node, n2i, n2f, last_rotation, rot_step) last_rotation += rot_step else: crender.init_circular_node_item(node, n2i, n2f) elif mode == "r": if _leaf(node): rrender.init_rect_leaf_item(node, n2i, n2f) else: rrender.init_rect_node_item(node, n2i, n2f) if node is not root_node or not hide_root: render_node_content(node, n2i, n2f, img) mainRect = parent.rect() if mode == "c": tree_radius = crender.render_circular(root_node, n2i, rot_step) mainRect.adjust( -tree_radius, -tree_radius, tree_radius, tree_radius) else: iwidth = n2i[root_node].fullRegion.width() iheight = n2i[root_node].fullRegion.height() mainRect.adjust(0, 0, iwidth, iheight) tree_radius = iwidth # The order by which the following methods IS IMPORTANT render_floatings(n2i, n2f, img, parent.float_layer, parent.float_behind_layer) aligned_region_width = render_aligned_faces(img, mainRect, parent.tree_layer, n2i, n2f) render_backgrounds(img, mainRect, parent.bg_layer, n2i, n2f) adjust_faces_to_tranformations(img, mainRect, n2i, n2f, TREE_LAYERS) parent.setRect(mainRect) parent.setPen(QtGui.QPen(QtCore.Qt.NoPen)) if img.rotation: rect = parent.boundingRect() x = rect.x() + rect.width()/2 y = rect.y() + rect.height()/2 parent.setTransform(QtGui.QTransform().translate(x, y).rotate(img.rotation).translate(-x, -y)) frame = QtGui.QGraphicsRectItem() parent.setParentItem(frame) mainRect = parent.mapToScene(mainRect).boundingRect() mainRect.adjust(-img.margin_left, -img.margin_top, \ img.margin_right, img.margin_bottom) add_legend(img, mainRect, frame) add_title(img, mainRect, frame) add_scale(img, mainRect, frame) frame.setRect(mainRect) # Draws a border around the tree if not img.show_border: frame.setPen(QtGui.QPen(QtCore.Qt.NoPen)) else: frame.setPen(QtGui.QPen(QtGui.QColor("black"))) return frame, n2i, n2f