コード例 #1
0
 internal DCluster(DObject parent, DrawingCluster drawingCluster)
     : base(parent, drawingCluster)
 {
     Node.Attr.FillColor = Drawing.Color.White;
 }
コード例 #2
0
        private void CreateMSAGLGraphAndPopulatePanelWithAssociatedControls()
        {
            if (Graph == null)
            {
                return;
            }
            Children.Clear();
            idGenerator = new ObjectIDGenerator();
            var edgeVMs   = Graph.Edges.ToArray();
            var nodeVMs   = edgeVMs.Select(e => e.Head).Concat(edgeVMs.Select(e => e.Tail)).Distinct().Select(nvm => new NodeWrapper(nvm, idGenerator)).ToDictionary(nw => nw.VM, nw => nw);
            var parentVMs = nodeVMs.Select(kv => Graph.Parent[kv.Key]).Where(pvm => pvm != null).Distinct().Select(pvm => nodeVMs[pvm]).ToArray();
            var leafVMs   = nodeVMs.Values.Except(parentVMs).ToArray();

            graph = new Microsoft.Msagl.Drawing.Graph
            {
                LayoutAlgorithmSettings = CurrentLayoutSettings
            };
            graph.RootSubgraph.IsVisible = false;
            vmOfCtrl = new Dictionary <IControl, Wrapper>();
            foreach (var sgvm in parentVMs)
            {
                var sg = new Microsoft.Msagl.Drawing.Subgraph(sgvm.ID);
                sgvm.DNode = sg;
                var ctrl = CreateControl(sgvm.VM, n => new TextSticker
                {
                    Text = n.ToString(),
                    HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Stretch,
                    VerticalAlignment   = Avalonia.Layout.VerticalAlignment.Stretch
                }, 1);
                vmOfCtrl[ctrl] = sgvm;
            }
            foreach (var sgvm in parentVMs)
            {
                var parent = Graph.Parent[sgvm.VM];
                var pGraph = (parent == null) ? graph.RootSubgraph : (Microsoft.Msagl.Drawing.Subgraph)nodeVMs[parent].DNode;
                pGraph.AddSubgraph((Microsoft.Msagl.Drawing.Subgraph)sgvm.DNode);
            }
            foreach (var evm in edgeVMs)
            {
                var dEdge = graph.AddEdge(nodeVMs[evm.Tail].ID, nodeVMs[evm.Head].ID);
                dEdge.Attr.ArrowheadAtSource = Edge.GetArrowStyle(evm.TailSymbol);
                dEdge.Attr.ArrowheadAtTarget = Edge.GetArrowStyle(evm.HeadSymbol);
                dEdge.LabelText = "x";
                evm.DEdge       = dEdge;
                CreateControl(evm, _ => new Connection(), 2);
            }
            foreach (var nvm in leafVMs)
            {
                var dNode = graph.FindNode(nvm.ID);
                nvm.DNode = dNode;
                var ctrl = CreateControl(nvm.VM, n => new TextSticker {
                    Text = n.ToString()
                }, 4);
                vmOfCtrl[ctrl] = nvm;
                var parent = Graph.Parent[nvm.VM];
                if (parent != null)
                {
                    var pw = nodeVMs[parent];
                    ((Microsoft.Msagl.Drawing.Subgraph)pw.DNode).AddNode(dNode);
                }
            }

            graph.Attr.LayerDirection = (Graph.Orientation == Graph.Orientations.Vertical)
        ? Microsoft.Msagl.Drawing.LayerDirection.TB
        : Microsoft.Msagl.Drawing.LayerDirection.LR;
            var flowOrder  = (Graph.Orientation == Graph.Orientations.Vertical) ? Graph.VerticalOrder : Graph.HorizontalOrder;
            var otherOrder = (Graph.Orientation == Graph.Orientations.Vertical) ? Graph.HorizontalOrder : Graph.VerticalOrder;

            IEnumerable <(NodeWrapper, NodeWrapper)> ComputeConstraints(Func <object, object, int> comparison) =>
            (from n1 in nodeVMs
             from n2 in nodeVMs
             let order = comparison(n1.Key, n2.Key)
                             where order != 0
                         select(order < 0) ? (n1.Value, n2.Value) : (n2.Value, n1.Value)).Distinct();

            foreach (var flowConstraint in ComputeConstraints(flowOrder))
            {
                graph.LayerConstraints.AddUpDownConstraint(flowConstraint.Item1.DNode, flowConstraint.Item2.DNode);
            }
            foreach (var otherConstraint in ComputeConstraints(otherOrder))
            {
                graph.LayerConstraints.AddLeftRightConstraint(otherConstraint.Item1.DNode, otherConstraint.Item2.DNode);
            }


            graph.CreateGeometryGraph();
            graph.GeometryGraph.RootCluster.RectangularBoundary = new Microsoft.Msagl.Core.Geometry.RectangularClusterBoundary();



            foreach (var evm in edgeVMs)
            {
                if (!evm.Label.Equals(string.Empty))
                {
                    var ctrl = CreateControl(evm.Label, l => new TextBlock {
                        Text = l.ToString(), FontSize = 6
                    }, 3);
                    vmOfCtrl[ctrl] = new LabelWrapper(evm.Label, idGenerator, evm.DEdge.Label);
                }
            }
        }
コード例 #3
0
 internal DCluster(DObject parent, DrawingCluster drawingCluster)
     : base(parent, drawingCluster)
 {
     Node.Attr.FillColor = Drawing.Color.White;
 }