示例#1
0
        private void MeatureNodeLabel(SankeyNode node)
        {
            var size = MeasureHepler.MeasureString(node.Name, diagram.LabelStyle, CultureInfo.CurrentCulture);

            node.LabelHeight = size.Height;
            node.LabelWidth  = size.Width;
        }
示例#2
0
 public void UpdateLabelAdjustY()
 {
     if (diagram.NodeLabelStyle != null)
     {
         LabelAdjustedY = MeasureHepler.MeasureString("5", diagram.NodeLabelStyle, CultureInfo.CurrentCulture).Height;
     }
 }
示例#3
0
        public void RemeatureLabel()
        {
            if (currentNodes == null || currentNodes.Count < 2)
            {
                return;
            }

            if (diagram.SankeyFlowDirection == FlowDirection.TopToBottom)
            {
                currentNodes[0][0].Label.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
                measuredLabelHeight = currentNodes[0][0].Label.DesiredSize.Height;
            }
            else
            {
                measuredFirstLevelLabelWidth = currentNodes[0].Max(n => MeasureHepler.MeasureString(n.Name, diagram.LabelStyle, CultureInfo.CurrentCulture).Width);
                measuredLastLevelLabelWidth  = currentNodes.Last().Value.Max(n => MeasureHepler.MeasureString(n.Name, diagram.LabelStyle, CultureInfo.CurrentCulture).Width);
            }

            foreach (var levelNodes in currentNodes.Values)
            {
                foreach (var node in levelNodes)
                {
                    MeatureNodeLabel(node);
                }
            }
        }
示例#4
0
        public MainViewModel()
        {
            random            = new Random();
            bubbleColor       = (Brush)Application.Current.FindResource("BubbleColor");
            bubbleLabelStyle1 = (Style)Application.Current.FindResource("BubbleLabelStyle1");
            bubbleLabelStyle2 = (Style)Application.Current.FindResource("BubbleLabelStyle2");
            BubbleLabelStyle  = bubbleLabelStyle2;
            Label             = "finish the fight";
            Diameter          = 55;
            BubbleGap         = 55;
            //BubbleBrush = bubbleColor;
            //AnticipateMinRadius = 1;

            // random datas
            var datas = new List <BubbleData>();
            var count = 10;

            for (var index = 0; index < count; index++)
            {
                var name   = "word" + index.ToString();
                var weight = 5 * (index + 1);

                datas.Add(new BubbleData()
                {
                    Name   = name,
                    Weight = weight,
                    //Color = bubbleColor,

                    LabelSizes = new Dictionary <string, Size>()
                    {
                        { "Name", MeasureHepler.MeasureString(name, bubbleLabelStyle1, CultureInfo.CurrentCulture) },
                        { "Weight", MeasureHepler.MeasureString(weight.ToString(), bubbleLabelStyle2, CultureInfo.CurrentCulture) }
                    }
                });
            }

            Datas         = datas;
            BubbleBrushes = new Dictionary <string, Brush>()
            {
                { "word1", bubbleColor }
            };
        }
示例#5
0
        private Dictionary <int, List <SankeyNode> > UpdateNodeLayout(List <SankeyNode> nodes, double nodeThickness)
        {
            var tempNodes   = new Dictionary <double, List <SankeyNode> >();
            var remainNodes = nodes;
            var nextNodes   = new List <SankeyNode>();
            var length      = 0.0;
            var levelIndex  = 0;
            var linkLength  = 0.0;

            while (remainNodes.Count > 0)
            {
                nextNodes = new List <SankeyNode>();
                var nodeIndex = 0;
                var nodeCount = remainNodes.Count;

                for (; nodeIndex < nodeCount; nodeIndex++)
                {
                    var node = remainNodes[nodeIndex];

                    if (diagram.SankeyFlowDirection == FlowDirection.TopToBottom)
                    {
                        node.Y = levelIndex;
                    }
                    else
                    {
                        node.X = levelIndex;
                    }

                    var linkIndex = 0;
                    var linkCount = node.OutLinks.Count;

                    for (; linkIndex < linkCount; linkIndex++)
                    {
                        nextNodes.Add(node.OutLinks[linkIndex].ToNode);
                    }
                }

                remainNodes = nextNodes;
                levelIndex++;
            }

            // move all the node without outLinks to end
            foreach (var node in nodes)
            {
                if (node.OutLinks.Count == 0)
                {
                    if (diagram.SankeyFlowDirection == FlowDirection.TopToBottom)
                    {
                        node.Y = levelIndex - 1;
                    }
                    else
                    {
                        node.X = levelIndex - 1;
                    }
                }
            }

            if (diagram.FirstAndLastLabelPosition == FirstAndLastLabelPosition.Outward)
            {
                if (diagram.SankeyFlowDirection == FlowDirection.TopToBottom)
                {
                    if (!(measuredLabelHeight > 0))
                    {
                        measuredLabelHeight = MeasureHepler.MeasureString(nodes[0].Name, diagram.LabelStyle, CultureInfo.CurrentCulture).Height;
                    }

                    if (!CheckInsufficientArea(measuredLabelHeight * 2, DiagramCanvas.ActualHeight))
                    {
                        return(null);
                    }

                    DiagramCanvas.Margin = new Thickness(0, measuredLabelHeight, 0, measuredLabelHeight);
                }
                else
                {
                    if (!(measuredFirstLevelLabelWidth > 0))
                    {
                        measuredFirstLevelLabelWidth = nodes.FindAll(n => n.X == 0).Max(n => MeasureHepler.MeasureString(n.Name, diagram.LabelStyle, CultureInfo.CurrentCulture).Width);
                    }

                    if (!(measuredLastLevelLabelWidth > 0))
                    {
                        measuredLastLevelLabelWidth = nodes.FindAll(n => n.X == levelIndex - 1).Max(n => MeasureHepler.MeasureString(n.Name, diagram.LabelStyle, CultureInfo.CurrentCulture).Width);
                    }

                    if (!CheckInsufficientArea(measuredLastLevelLabelWidth + measuredFirstLevelLabelWidth, DiagramCanvas.ActualWidth))
                    {
                        return(null);
                    }

                    DiagramCanvas.Margin = new Thickness(measuredFirstLevelLabelWidth, 0, measuredLastLevelLabelWidth, 0);
                }

                diagram.UpdateLayout();
            }
            else
            {
                DiagramCanvas.Margin = new Thickness(0);
            }

            if (diagram.SankeyFlowDirection == FlowDirection.TopToBottom)
            {
                length = DiagramCanvas.ActualHeight;
            }
            else
            {
                length = DiagramCanvas.ActualWidth;
            }

            linkLength = (length - nodeThickness) / (levelIndex - 1);

            foreach (var node in nodes)
            {
                var max = Math.Max(node.InLinks.Sum(l => l.Weight), node.OutLinks.Sum(l => l.Weight));

                if (diagram.SankeyFlowDirection == FlowDirection.TopToBottom)
                {
                    if (tempNodes.Keys.Contains(node.Y))
                    {
                        tempNodes[node.Y].Add(node);
                    }
                    else
                    {
                        tempNodes.Add(node.Y, new List <SankeyNode>()
                        {
                            node
                        });
                    }

                    node.Y           *= linkLength;
                    node.Shape.Width  = max;
                    node.Shape.Height = diagram.NodeThickness;
                }
                else
                {
                    if (tempNodes.Keys.Contains(node.X))
                    {
                        tempNodes[node.X].Add(node);
                    }
                    else
                    {
                        tempNodes.Add(node.X, new List <SankeyNode>()
                        {
                            node
                        });
                    }

                    node.X           *= linkLength;
                    node.Shape.Height = max;
                    node.Shape.Width  = diagram.NodeThickness;
                }
            }

            return(tempNodes.OrderBy(n => n.Key).ToDictionary(item => (int)item.Key, item => item.Value));
        }