示例#1
0
        public async Task OpenGraphItFile(InputFileChangeEventArgs e, bool overwrite)
        {
            Overwrite = overwrite;
            try
            {
                byte[]  temp;
                Options newOptions = new Options();
                using (var streamReader = new MemoryStream())
                {
                    await e.File.OpenReadStream().CopyToAsync(streamReader);

                    temp = streamReader.ToArray();
                }
                OpenPreference = false;
                string      graph   = DecodeAndInflate(temp);
                XmlDocument xmlData = new XmlDocument();
                xmlData.LoadXml(graph);
                if (Overwrite)
                {
                    Graph = new Graph();
                }
                Traverse(xmlData, NodeService.NextId(Graph.Nodes), EdgeService.NextId(Graph.Edges));
                await GraphChanged.InvokeAsync(Graph);

                if (Overwrite)
                {
                    await OptionsChanged.InvokeAsync(Options);
                }
            }
            catch (ObjectDisposedException)
            {
                ErrorOpening = true;
            }
        }
示例#2
0
        public async Task Save()
        {
            Graph.Nodes.Clear();
            Graph.Edges.Clear();
            for (int i = PlayAlgorithm.Count - 1; i >= 0; i--)
            {
                foreach (GraphObject obj in PlayAlgorithm[i])
                {
                    if (obj is Node)
                    {
                        Node newNode = new Node(obj as Node);
                        if (!Graph.Nodes.Contains(newNode))
                        {
                            Graph.Nodes.Add(newNode);
                        }
                    }
                    else
                    {
                        Edge newEdge = new Edge(obj as Edge);
                        if (!Graph.Edges.Contains(newEdge))
                        {
                            Graph.Edges.Add(newEdge);
                        }
                    }
                }
            }
            foreach (Edge edge in Graph.Edges)
            {
                edge.Head = Graph.Nodes.First(n => edge.Head == n);
                edge.Tail = Graph.Nodes.First(n => edge.Tail == n);
            }
            await GraphChanged.InvokeAsync(Graph);

            await Reset();
        }
示例#3
0
文件: Graph.cs 项目: Kreyren/Korduene
        private void OnGraphChanged(string propertyName)
        {
            var _ignoredProperties = new[] { nameof(MousePosition), nameof(FilePath), nameof(LastMouseDownPosition), nameof(MouseDownPort), nameof(LinkingLink), nameof(MouseUpPort) };

            if (_ignoredProperties.Contains(propertyName))
            {
                return;
            }

            GraphChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
示例#4
0
        private void OnLayoutTypeChanged(ISceneNode node, Type newLayoutType)
        {
            if (node != rootComponent.Node)
            {
                throw new NotImplementedException();
            }
            var layout = layoutsByType[newLayoutType];

            layouts[node]      = layout;
            RootLayoutInstance = layout.ArrangeAndDecorate(GlobalGraph);
            GraphChanged?.Invoke();
        }
示例#5
0
 public void AddEdge(int from, int to)
 {
     rootComponent.Edges.Add(new Pair <int>(from, to));
     if (InsideTransaction)
     {
         return;
     }
     GlobalGraph        = new StoryGraph(rootComponent.Node, GetEdges(), false);
     RootLayoutInstance = layouts.Values.Single().ArrangeAndDecorate(GlobalGraph);
     editSceneComponent.OnEdgeAdded(new Pair <int>(from, to), GlobalGraph);
     GraphChanged?.Invoke();
 }
示例#6
0
        public async Task CreateGraph()
        {
            Loading = true;
            switch (WantedGraph)
            {
            case CommonGraph.Complete:
                CreateComplete();
                break;

            case CommonGraph.CBipartite:
                CreateCBipartite();
                break;

            case CommonGraph.Star:
                CreateStar();
                break;

            case CommonGraph.Cyclic:
                if (numNodes > 2)
                {
                    CreateCyclic();
                }
                else
                {
                    ErrorCreatingGraph = "For a cyclic graph you need at least 3 nodes (assuming simple graph)";
                }
                break;

            case CommonGraph.RBipartite:
                if (numNodes % 2 == 0 && KValue <= numNodes / 2)
                {
                    CreateRBipartite();
                }
                else
                {
                    ErrorCreatingGraph = "k-Regular Bipartite graph must satisfy: Even number of nodes AND K is at most half the number of nodes";
                }
                break;

            case CommonGraph.Tree:
                CreateTree();
                break;
            }
            WantedGraph = null;
            Loading     = false;
            await GraphChanged.InvokeAsync(Graph);
        }
示例#7
0
        public async Task Paste()
        {
            int nextNodeId = NodeService.NextId(Graph.Nodes);

            PasteOffset += 5 * SVGControl.Scale;
            ActiveGraph  = new Graph();
            foreach (Node node in CopiedGraph.Nodes)
            {
                ActiveGraph.Nodes.Add(NodeService.AddNode(Graph.Nodes, node, nextNodeId, PasteOffset));
            }
            foreach (Edge edge in CopiedGraph.Edges)
            {
                ActiveGraph.Edges.Add(EdgeService.AddEdge(Graph, edge, nextNodeId));
            }
            await GraphChanged.InvokeAsync(Graph);

            await ActiveGraphChanged.InvokeAsync(ActiveGraph);
        }
示例#8
0
        private void OnStoryNodeAdded(ISceneNode parent, ISceneNode newNode)
        {
            var layoutRoot = SearchLayoutRoot(newNode);

            if (layoutRoot == newNode)
            {
                throw new NotImplementedException();
                //var layoutType = newNode.GetAspect<IStoryAspect>().StartLayoutType;
                //var layout = layoutsByType[layoutType];
                //layouts[newNode] = layout;
                //var sg = new StoryGraph(newNode, );
                //layout.ArrangeAndDecorate();
            }

            GlobalGraph = new StoryGraph(rootComponent.Node, GetEdges(), false);
            editSceneComponent.OnStoryNodeAdded(parent, newNode, GlobalGraph);
            RootLayoutInstance = layouts[rootComponent.Node].ArrangeAndDecorate(GlobalGraph);
            GraphChanged?.Invoke();
        }
示例#9
0
        private void OnStoryNodeRemoved(ISceneNode parent, ISceneNode removedNode)
        {
            var layoutRoot = SearchLayoutRoot(removedNode);

            if (layoutRoot == removedNode)
            {
                throw new NotImplementedException();
                //var layoutType = newNode.GetAspect<IStoryAspect>().StartLayoutType;
                //var layout = layoutsByType[layoutType];
                //layouts[newNode] = layout;
                //var sg = new StoryGraph(newNode, );
                //layout.ArrangeAndDecorate();
            }
            var removedIds = removedNode.GetComponent <IStoryComponent>().EnumerateStoryAspectsDeep(false).Select(x => x.Node.Id).ToArray();

            rootComponent.Edges.RemoveWhere(x => removedIds.Contains(x.First) || removedIds.Contains(x.Second));
            GlobalGraph = new StoryGraph(rootComponent.Node, GetEdges(), false);
            editSceneComponent.OnStoryNodeRemoved(parent, removedNode, GlobalGraph);
            RootLayoutInstance = layouts[rootComponent.Node].ArrangeAndDecorate(GlobalGraph);
            GraphChanged?.Invoke();
        }
示例#10
0
        public async Task OnChangeText(ChangeEventArgs e)
        {
            string input = e.Value.ToString();

            double[,] weights = ParseInput(input);
            if (ValidInput)
            {
                int difference = weights.GetLength(0) - Graph.Nodes.Count;
                if (difference > 0)
                {
                    for (int i = 1; i <= difference; i++)
                    {
                        NodeService.AddNode(Graph.Nodes, DefaultOptions, GetRandom(true), GetRandom(false));
                    }
                }
                else if (difference < 0)
                {
                    for (int i = difference; i < 0; i++)
                    {
                        Graph.Nodes.RemoveAt(Graph.Nodes.Count + i);
                    }
                }
                Graph.Edges.Clear();
                for (int i = 0; i < weights.GetLength(0); i++)
                {
                    for (int j = 0; j < weights.GetLength(1); j++)
                    {
                        if (weights[i, j] != 0)
                        {
                            EdgeService.AddEdge(Graph.Edges, DefaultOptions, Graph.Nodes[j], Graph.Nodes[i], weights[i, j]);
                        }
                    }
                }
                await GraphChanged.InvokeAsync(Graph);

                ShowText = GetText();
            }
        }
示例#11
0
        public async Task OnChangeTable(ChangeEventArgs e, Node tail, Node head)
        {
            double weight = Math.Round(double.Parse(e.Value.ToString()), 2);

            if (weight > 0)
            {
                RemoveEdge(tail, head);
                EdgeService.AddEdge(Graph.Edges, DefaultOptions, head, tail, weight);
            }
            else if (weight == 0)
            {
                foreach (Edge edge in Graph.Edges)
                {
                    if ((edge.Head == head && edge.Tail == tail) ||
                        (edge.Head == tail && edge.Tail == head && !Graph.Directed))
                    {
                        Graph.Edges.Remove(edge);
                        break;
                    }
                }
            }
            await GraphChanged.InvokeAsync(Graph);
        }
示例#12
0
        private void OnWorldRootChanged(ISceneNode newRoot)
        {
            rootComponent = newRoot.SearchComponent <StoryServiceRootComponent>();
            if (rootComponent == null)
            {
                rootComponent = AmFactory.Create <StoryServiceRootComponent>();
                newRoot.Components.Add(rootComponent);
            }

            var rootNode = newRoot;

            rootComponent = rootNode.SearchComponent <StoryServiceRootComponent>();
            if (rootComponent == null)
            {
                rootComponent = AmFactory.Create <StoryServiceRootComponent>();
                rootNode.Components.Add(rootComponent);
            }

            GlobalGraph = new StoryGraph(rootNode, GetEdges(), false);

            layouts.Clear();
            var aStory = rootNode.SearchComponent <IStoryComponent>();

            if (aStory?.StartLayoutType == null)
            {
                throw new InvalidOperationException("Root SceneNode is expected to have a StoryAspect and be a LayoutRoot.");
            }
            var layout = layoutsByType[aStory.StartLayoutType];

            layouts.Add(rootNode, layout);
            // todo: sub-layouts
            editSceneComponent.OnWorldRootChanged(newRoot, GlobalGraph);
            var rootSg = new StoryGraph(newRoot, (IReadOnlyList <Pair <int> >)rootComponent.Edges, true);

            RootLayoutInstance = layout.ArrangeAndDecorate(rootSg);
            GraphChanged?.Invoke();
        }
示例#13
0
        public async Task Select(MenuEventArgs <MenuItem> e)
        {
            switch (e.Item.Text)
            {
            case "Copy":
                Copy();
                break;

            case "Paste":
                await Paste();

                break;

            case "Left":
            case "Center":
            case "Right":
            case "Top":
            case "Middle":
            case "Bottom":
                NodeService.Align(ActiveGraph.Nodes, e.Item.Text);
                break;

            case "Delete":
                await DeleteActive.InvokeAsync("all");

                break;

            case "Edit":
            case "Nodes":
            case "Edges":
                await ChangeMenu.InvokeAsync(NavChoice.Design);

                break;

            case "All Nodes":
                await Activate("nodes");

                break;

            case "All Edges":
                await Activate("edges");

                break;

            case "Everything":
                await Activate("all");

                break;

            case "Insert Edge":
                await InsertEdge();

                break;

            case "Insert Node":
                NodeService.AddNode(Graph.Nodes, Options.Default, origin[0] * SVGControl.Scale + SVGControl.Xaxis, origin[1] * SVGControl.Scale + SVGControl.Yaxis);
                await GraphChanged.InvokeAsync(Graph);

                break;

            case "Stop Algorithm":
                if (StartAlgorithm.Done)
                {
                    StartAlgorithm.Clear = true;
                }
                else
                {
                    await Reset();
                }
                break;

            case "Zoom In":
                if (ZoomService.ZoomIn(SVGControl))
                {
                    await SVGControlChanged.InvokeAsync(SVGControl);
                }
                break;

            case "Zoom Out":
                if (ZoomService.ZoomOut(SVGControl))
                {
                    await SVGControlChanged.InvokeAsync(SVGControl);
                }
                break;
            }
        }
 protected virtual void OnGraphChanged(IEnumerable <HistoryPrice> prices)
 {
     GraphChanged?.Invoke(prices);
 }
示例#15
0
 protected void InvokeChanged(IReadOnlyList <TNode> addedNodes = null, IReadOnlyList <TNode> removedNodes = null, IReadOnlyList <TConnection> addedConnections = null, IReadOnlyList <TConnection> removedConnections = null)
 {
     GraphChanged?.Invoke(addedNodes ?? _emptyNodes, removedNodes ?? _emptyNodes, addedConnections ?? _emptyConnections, removedConnections ?? _emptyConnections);
 }
示例#16
0
 public async Task OnTableDelete(Node node)
 {
     NodeService.DeleteNode(Graph, node);
     await GraphChanged.InvokeAsync(Graph);
 }
示例#17
0
 protected void OnGraphChanged() => GraphChanged?.Invoke();