コード例 #1
0
        public static void CreateBridge(object sender, bool clone)
        {
            BridgeEndPoint = new Point(Canvas.GetLeft((Border)sender) + ((Border)sender).Width / 2, Canvas.GetTop((Border)sender) + ((Border)sender).Height / 2);

            foreach (VertexBag x in (!clone ? CurrentStorage : StorageForCopy).BindingVertexWithAlgoVertex)
            {
                if (x.GraphicVertex == ((Border)sender))
                {
                    (!clone ? CurrentStorage : StorageForCopy).EdgeList.Add(new Edge(StartVertex.DataVertex, x.DataVertex, 0));
                }
            }

            XmlSerializableEdgeBag NewEdgeBag = XmlSerializableEdgeBag.GenerateBridge(BridgeStartPoint, BridgeEndPoint);

            NewEdgeBag.DataEdge = (!clone ? CurrentStorage : StorageForCopy).EdgeList.Last();
            (!clone ? CurrentStorage : StorageForCopy).BindingBridgeWithAlgoEdge.Add(NewEdgeBag);

            foreach (KeyValuePair <Border, List <Line> > x in (!clone ? CurrentStorage : StorageForCopy).BindingVertexWithLinesStart)
            {
                if (x.Key == StartVertex.GraphicVertex)
                {
                    x.Value.Add(NewEdgeBag.GraphicEdge);
                }
            }
            foreach (KeyValuePair <Border, List <Line> > x in (!clone ? CurrentStorage : StorageForCopy).BindingVertexWithLinesEnd)
            {
                if (x.Key == (Border)sender)
                {
                    x.Value.Add(NewEdgeBag.GraphicEdge);
                }
            }

            if (clone)
            {
                StorageForCopy.DrawAreaChildrens.Add(NewEdgeBag.GraphicEdge);
            }
            else
            {
                DrawAreaCanvas.Children.Add(NewEdgeBag.GraphicEdge);
            }

            BridgeStartPoint = new Point();
            if (!clone)
            {
                if (StorageChanged != null)
                {
                    StorageChanged(new StorageChangeEventArgs(Backup()));
                }
            }
        }
コード例 #2
0
        private static void DeleteVertex(object sender)
        {
            StartVertex = (from vertex in CurrentStorage.BindingVertexWithAlgoVertex
                           where vertex.GraphicVertex == ((Border)sender)
                           select vertex).ToList()[0];

            var EdgesToDelete = (from edge in CurrentStorage.BindingBridgeWithAlgoEdge
                                 where edge.DataEdge.FirstPoint == StartVertex.DataVertex ||
                                 edge.DataEdge.SecondPoint == StartVertex.DataVertex
                                 select edge).ToList();

            // Удаление вершины
            CurrentStorage.VertexList.Remove(StartVertex.DataVertex);

            // Удаление ребер связаных с ней
            foreach (XmlSerializableEdgeBag x in EdgesToDelete)
            {
                CurrentStorage.EdgeList.Remove(x.DataEdge);
            }
            // Удаление графических составляющих

            XmlSerializableEdgeBag RememberEdgeBag = null;

            foreach (KeyValuePair <Border, List <Line> > x in CurrentStorage.BindingVertexWithLinesStart)
            {
                if (x.Key == ((Border)sender))
                {
                    foreach (Line l in x.Value)
                    {
                        DrawAreaCanvas.Children.Remove(l);
                        CurrentStorage.BridgesList.Remove(l);
                        foreach (XmlSerializableEdgeBag eb in CurrentStorage.BindingBridgeWithAlgoEdge)
                        {
                            if (eb.GraphicEdge == l)
                            {
                                RememberEdgeBag = eb;
                            }
                        }
                        CurrentStorage.BindingBridgeWithAlgoEdge.Remove(RememberEdgeBag);
                    }
                    DrawAreaCanvas.Children.Remove(x.Key);
                }
            }

            CurrentStorage.BindingVertexWithLinesStart.Remove((Border)sender);
            foreach (KeyValuePair <Border, List <Line> > x in CurrentStorage.BindingVertexWithLinesEnd)
            {
                if (x.Key == ((Border)sender))
                {
                    foreach (Line l in x.Value)
                    {
                        DrawAreaCanvas.Children.Remove(l);
                        CurrentStorage.BridgesList.Remove(l);
                        foreach (XmlSerializableEdgeBag eb in CurrentStorage.BindingBridgeWithAlgoEdge)
                        {
                            if (eb.GraphicEdge == l)
                            {
                                RememberEdgeBag = eb;
                            }
                        }
                        CurrentStorage.BindingBridgeWithAlgoEdge.Remove(RememberEdgeBag);
                    }
                    DrawAreaCanvas.Children.Remove(x.Key);
                }
            }
            CurrentStorage.BindingVertexWithLinesEnd.Remove((Border)sender);
            // Удаление связей в коде
            XmlSerializableVertexBag RememberVertex = null;

            foreach (VertexBag x in CurrentStorage.BindingVertexWithAlgoVertex)
            {
                if (x.GraphicVertex == ((Border)sender))
                {
                    RememberVertex = new XmlSerializableVertexBag(x.GraphicVertex, x.DataVertex);
                }
            }
            CurrentStorage.BindingVertexWithAlgoVertex.Remove(RememberVertex);

            if (StorageChanged != null)
            {
                StorageChanged(new StorageChangeEventArgs(Backup()));
            }
        }