/// <summary> /// 生成图形化的树型图 /// </summary> /// <returns></returns> public TreeGraph GenerateGraph() { TreeGraphLabelNode originalGraphNode = GenerateGraphLabelNode((TNode)this, 0, 0, this.CalculateMaxWidth() * 2); TraverseTreeGraphContext context = new TraverseTreeGraphContext(); return(new TreeGraph() { Root = GenerateGraphNodeWithConnectors(null, originalGraphNode, context), Width = context.Width, Height = context.Height }); }
private static void FillGraphConnectorNodes(TreeGraphLabelNode originalGraphNode, TreeGraphLabelNode resutLabelNode, TraverseTreeGraphContext context) { if (originalGraphNode.Children.Count > 0) { int startX = originalGraphNode.Children[0].X; int endX = originalGraphNode.Children[originalGraphNode.Children.Count - 1].X; for (int i = startX; i <= endX; i++) { TreeGraphConnectorNode connector = null; TreeGraphNodeBase child = originalGraphNode.Children.Find(c => c.X == i); if (child != null) { if (originalGraphNode.Children.Count == 1) { connector = new TreeGraphConnectorNode(TreeGraphNodeType.VLine, i, originalGraphNode.Y + 1); } else { if (child == originalGraphNode.Children[0]) { connector = new TreeGraphConnectorNode(TreeGraphNodeType.LeftCorner, i, originalGraphNode.Y + 1); } else if (child == originalGraphNode.Children[originalGraphNode.Children.Count - 1]) { connector = new TreeGraphConnectorNode(TreeGraphNodeType.RightCorner, i, originalGraphNode.Y + 1); } else if (child.X == originalGraphNode.X) { connector = new TreeGraphConnectorNode(TreeGraphNodeType.Cross, i, originalGraphNode.Y + 1); } else { connector = new TreeGraphConnectorNode(TreeGraphNodeType.Tee, i, originalGraphNode.Y + 1); } } } else { if (i == originalGraphNode.X) { connector = new TreeGraphConnectorNode(TreeGraphNodeType.ReverseTee, i, originalGraphNode.Y + 1); } else { connector = new TreeGraphConnectorNode(TreeGraphNodeType.HLine, i, originalGraphNode.Y + 1); } } context.Width = Math.Max(context.Width, connector.X + 1); context.Height = Math.Max(context.Height, connector.Y + 1); resutLabelNode.Children.Add(connector); } } }
private static TreeGraphLabelNode GenerateGraphNodeWithConnectors(TreeGraphNodeBase parentGraphNode, TreeGraphLabelNode originalGraphNode, TraverseTreeGraphContext context) { TreeGraphLabelNode resutLabelNode = new TreeGraphLabelNode() { Name = originalGraphNode.Name, Description = originalGraphNode.Description, X = originalGraphNode.X, Y = originalGraphNode.Y }; context.Width = Math.Max(context.Width, resutLabelNode.X + 1); context.Height = Math.Max(context.Height, resutLabelNode.Y + 1); if (parentGraphNode != null) { parentGraphNode.Children.Add(resutLabelNode); } FillGraphConnectorNodes(originalGraphNode, resutLabelNode, context); foreach (TreeGraphNodeBase childConnectorNode in resutLabelNode.Children) { TreeGraphLabelNode matchedLabelNode = (TreeGraphLabelNode)originalGraphNode.Children.Find(n => n.X == childConnectorNode.X); if (matchedLabelNode != null) { GenerateGraphNodeWithConnectors(childConnectorNode, matchedLabelNode, context); } } return(resutLabelNode); }