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())); } } }
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())); } }