private void InitToolBarCommands()
        {
            ToolBarCommands = new ObservableCollection <ToolBarCommandBase>();

            // Перемещение вершин - toogleCommand
            var moveCommand = new ToolBarToggleCommand(
                () =>
            {
                IsMouseVerticesMovingEnabled = true;
                _state = State.MoveVertex;
                UserActionsManager.RegisterInfo("Включено перемещение вершин.");
            },
                () =>
            {
                IsMouseVerticesMovingEnabled = false;
                _state = State.Nothing;
                UserActionsManager.RegisterInfo("Отключено перемещение вершин.");
            },
                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("Move.png")),
                Description = "Перемещение вершин"
            };

            // Перемещение вершин
            var dontTouch = new ToolBarInstantCommand(
                () => UserActionsManager.RegisterMistake("Сказали же НЕ ТРОГАТЬ!!!", 1),
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("DontTouch.png")),
                Description = "НЕ ТРОГАТЬ"
            };

            // Завершение работы
            var finishTask = new ToolBarInstantCommand(
                () =>
            {
                UserActionsManager.ReportThatTaskFinished();
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("Complete.png")),
                Description = "Завершить задание"
            };

            ToolBarCommands.Add(moveCommand);
            ToolBarCommands.Add(dontTouch);
            ToolBarCommands.Add(finishTask);
        }
        private void InitToolBarCommands()
        {
            new SimpleDialog("Справка", Strings.Strings_RU.stage3Help).Show();

            #region Видимость
            var vis = true;

            var phase3VisCommand = new ToolBarInstantCommand(
                () =>
            {
                vis = !vis;
                WorkspaceGraphVisibility = vis ? Visibility.Visible : Visibility.Collapsed;
            },
                () => _state == State.Nothing
                )
            {
                Description = "Скрыть / Показать слой зелёного графа",
                Image       = new BitmapImage(GetImageUri("HideGreen.png"))
            };
            #endregion

            #region Справка
            var phase3HelpCommand = new ToolBarInstantCommand(
                () => new SimpleDialog("Справка", Strings.Strings_RU.stage3Help).Show(),
                () => _state == State.Nothing
                )
            {
                Description = Strings.Strings_RU.buttonHelp,
                Image       = new BitmapImage(GetImageUri("Info.png"))
            };
            #endregion

            #region Завершить этап
            var phase3Command = new ToolBarInstantCommand(
                () =>
            {
                var dialog     = new AnswerDialog(IsomorphismResult);
                dialog.Closed += (sender, args) =>
                {
                    if (dialog.DialogResult.HasValue && dialog.DialogResult.Value && dialog.Answer)
                    {
                        UserActionsManager.SendReportOnEveryAction = true;
                        UserActionsManager.RegisterInfo("Ответ пользователя: Графы изоморфны");
                        UserActionsManager.ReportThatTaskFinished();
                    }
                    if (dialog.DialogResult.HasValue && dialog.DialogResult.Value && !dialog.Answer)
                    {
                        UserActionsManager.SendReportOnEveryAction = true;
                        UserActionsManager.RegisterInfo("Ответ пользователя: Графы неизоморфны.\n" + dialog.Message);
                        UserActionsManager.ReportThatTaskFinished();
                    }
                };
                dialog.Show();
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("Check.png")),
                Description = Strings.Strings_RU.stage3DoneButtonDisc
            };
            #endregion

            Phase3ToolBarCommands = new ObservableCollection <ToolBarCommandBase>
            {
                phase3VisCommand,
                phase3Command,
                phase3HelpCommand
            };
        }
        private void InitToolBarCommands()
        {
            ToolBarCommands = new ObservableCollection <ToolBarCommandBase>();

            // Выбор множества External stability
            var selectDsCommand = new ToolBarToggleCommand(
                () =>
            {
                if (_task == Task.TaskSelectDomSets)
                {
                    VertexClickCmd = new DelegateCommand(
                        o => SelectRMouseClick((IVertex)o),
                        o => true);
                    _state = State.SetEs;
                    IsMouseVerticesMovingEnabled = false;
                }
            },

                () =>
            {
                _state = State.Nothing;
                IsMouseVerticesMovingEnabled = true;
            },

                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("es.png")),
                Description = "Выбор множества внешней устойчивости"
            };

            // Вызов окна со справкой
            var helpM = new ToolBarInstantCommand(
                () => MessageBox.Show
                (
                    "Лабораторная работа \"Устойчивость графов \"\n "
                    +
                    "Задание \"Множество внешней устойчивости\"\n"
                    +
                    "Цель: найти число внешней устойчивости графа\n"
                    +
                    "\n"
                    +
                    "для перехода к следующему заданию нажмите ОК\n"
                    +
                    "Для изменения матрицы необходимо изменить значение в ячейке и нажать \"Enter\"\n"
                    +
                    "Либо дважды кликнуть мышью по ячейке матрицы\n"
                    +
                    "\n"
                    +
                    "Задания:\n"
                    +
                    "1.1 Заполнить матрицу смежности\n"
                    +
                    "1.2 Измените матрицу смежности под выполнение алгоритма красно-синих вершин\n"
                    +
                    "2.Выделите несколько доминирующих множеств графа\n (выделение множества доступно по кнопке <ES>\nзакрытие множества происходит по кнопке <{}>)\n"
                    +
                    "3.Определить число внешней устойчивости (пометить соответствующее множество вершин)"
                ),
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("help.png")),
                Description = "Справка"
            };

            // Проверка задания
            var checkButton = new ToolBarInstantCommand(
                () =>
            {
                var mp = new MatrixPrinter();
                var m  = Matrix;
                switch (_task)
                {
                case Task.TaskAdjacencyMatrix:
                    UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание 1.1. На проверку отправлена матрица: " + mp.MatrixToString(m));
                    CheckMatrix();
                    break;

                case Task.TaskModifiedAdjMatrix:
                    UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание 1.2. На проверку отправлена матрица: " + mp.MatrixToString(m));
                    CheckMatrixforAghorithm();
                    break;

                case Task.TaskSelectDomSets:
                    MessageBox.Show(string.Format(
                                        "Необходимо найти еще {0} множеств(о) внешней устойчивости", _countOfSes));
                    break;

                case Task.TaskFindMinDomSets:
                    IsMinDS();
                    break;

                case Task.TaskEnd:
                    UserActionsManager.ReportThatTaskFinished();
                    break;
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("ok.png")),
                Description = "Проверить матрицу"
            };

            // Проверка множества и его сохранение
            var addSetofES = new ToolBarInstantCommand(
                () =>
            {
                if (_task == Task.TaskSelectDomSets)
                {
                    ValidateSet();
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("add.png")),
                Description = "Добавить множество"
            };

            // Проверка задания
            var debugButton = new ToolBarInstantCommand(
                () =>
            {
                var counter = new MatrixErrorCounter();
                if (_task == Task.TaskAdjacencyMatrix)
                {
                    counter.FillInMatrix(Matrix, GivenGraph);
                }
                if (_task == Task.TaskModifiedAdjMatrix)
                {
                    counter.ModifyMatrix(Matrix);
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("ok.png")),
                Description = "Автозаполнение"
            };

            ToolBarCommands.Add(checkButton);
            ToolBarCommands.Add(selectDsCommand);
            ToolBarCommands.Add(addSetofES);
            ToolBarCommands.Add(helpM);
            //ToolBarCommands.Add(debugButton);
        }
Ejemplo n.º 4
0
        private void InitToolBarCommands()
        {
            ToolBarCommands = new ObservableCollection <ToolBarCommandBase>();

            // Перемещение вершин - toogleCommand
            var moveCommand = new ToolBarToggleCommand(
                () =>
            {
                IsMouseVerticesMovingEnabled = true;
                _state = State.MoveVertex;
                UserActionsManager.RegisterInfo("Включено перемещение вершин.");
            },
                () =>
            {
                IsMouseVerticesMovingEnabled = false;
                _state = State.Nothing;
                UserActionsManager.RegisterInfo("Отключено перемещение вершин.");
            },
                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("Move.png")),
                Description = "Перемещение вершин"
            };

            //удаление вершин
            var removeVertex = new ToolBarToggleCommand(
                () =>
            {
                UserActionsManager.RegisterInfo("Нажмите на вершину для удаления (все ее связи удалятся тоже)");
                _state = State.RemoveVertex;
            },
                () => _state = State.Nothing,
                () => _state == State.Nothing,
                () => _state == State.RemoveVertex
                );

            removeVertex.Image       = new BitmapImage(GetImageUri("DontTouch.png"));
            removeVertex.Description = "Удаление вершины";

            //Добавление вершинки
            var testBut = new ToolBarToggleCommand(
                () =>
            {
                UserActionsManager.RegisterInfo("Нажмите в то место, куда ходите добавить вершину.");
                _state = State.AddVertex;
            },
                () =>
            {
                _state = State.Nothing;
                UserActionsManager.RegisterInfo("Добавление вершины отменено");
            },
                () => _state == State.Nothing,
                () => _state == State.AddVertex
                );

            testBut.Image       = new BitmapImage(GetImageUri("NewVertex.png"));
            testBut.Description = "Добавить вершину";

            //Добавление ребрышка
            var addEdgeCommand = new ToolBarToggleCommand(
                () =>
            {
                _state = State.AddEdge1;
                UserActionsManager.RegisterInfo("Добавление ребра: Выберите выходную вершину.");
            },
                () =>
            {
                UserActionsManager.RegisterInfo("Добавление ребра завершено.");
                _state = State.Nothing;
            },
                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("NewEdge.png")),
                Description = "Добавление дуги"
            };

            /*  // Завершение работы
             * var finishTask = new ToolBarInstantCommand(
             *    () =>
             *    {
             *        UserActionsManager.ReportThatTaskFinished();
             *    },
             *    () => _state == State.Nothing
             *    )
             * {
             *    Image = new BitmapImage(GetImageUri("Complete.png")),
             *    Description = "Завершить задание"
             * };*/


            var checkGraphBut = new ToolBarInstantCommand(
                CheckGraph,
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("CondReady.png")),
                Description = "Проверить правильность построения графа"
            };

            var checkAllBut = new ToolBarInstantCommand(
                CheckPlan,
                () => _state == State.Nothing
                )
            {
                Image = new BitmapImage(GetImageUri("CondReady.png")), Description = "Проверить, плоский ли граф"
            };

            ToolBarCommands.Add(moveCommand);
            ToolBarCommands.Add(removeVertex);
            // ToolBarCommands.Add(finishTask);
            ToolBarCommands.Add(testBut);
            ToolBarCommands.Add(addEdgeCommand);
            ToolBarCommands.Add(checkGraphBut);
            ToolBarCommands.Add(checkAllBut);
        }
        private void InitToolBarCommands()
        {
            #region Первый этап
            #region Добавление рёбер
            var phase1AddEdgeCommand = new ToolBarToggleCommand(
                () =>
            {
                IsMouseVerticesMovingEnabled = false;
                IsEgesAddingEnabled          = true;
                _state = State.EdgesAdding;
            },
                () =>
            {
                IsMouseVerticesMovingEnabled = true;
                IsEgesAddingEnabled          = false;
                _state = State.Nothing;
            },
                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("Arrow.png")),
                Description = Strings.Strings_RU.buttonEdges
            };
            #endregion

            #region Завершить этап
            var allSubgraphs = new ObservableCollection <IGraph>();

            var phase1Command = new ToolBarInstantCommand(
                () =>
            {
                var solve = true;
                var gp    = new GraphPrinter();
                UserActionsManager.RegisterInfo(Strings.Strings_RU.stage1Check + gp.GraphToString(CurrentGraph));
                CurrentGraph.Vertices.ForEach(v1 =>
                                              CurrentGraph.Vertices.ForEach(v2 =>
                {
                    solve = solve && (v1.Equals(v2) || (CurrentGraph[v1, v2] == null ^
                                                        GivenGraph[
                                                            GivenGraph.Vertices.Single(v1.Equals),
                                                            GivenGraph.Vertices.Single(v2.Equals)] == null
                                                        ));
                }
                                                                            ));
                if (solve)
                {
                    UserActionsManager.RegisterInfo(Strings.Strings_RU.stage1Done);
                    GivenGraph   = CurrentGraph;
                    CurrentGraph = new UndirectedGraph();

                    Phase1ToolBarVisibility = Visibility.Collapsed;
                    Phase2ToolBarVisibility = Visibility.Visible;
                    L1 = Strings.Strings_RU.subgraph;

                    FindAllSubgraphs(GivenGraph, 0, GivenGraph.Vertices.ToList(), allSubgraphs);

                    new SimpleDialog("Справка", Strings.Strings_RU.stage2Help).Show();
                }
                else
                {
                    UserActionsManager.RegisterMistake(Strings.Strings_RU.stage1Mistake1, 10);
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("Check.png")),
                Description = Strings.Strings_RU.stage1DoneButtonDisc
            };
            #endregion

            #region Справка
            var phase1HelpCommand = new ToolBarInstantCommand(
                () =>
            {
                new SimpleDialog("Справка", Strings.Strings_RU.stage1Help).Show();
            },
                () => _state == State.Nothing
                )
            {
                Description = Strings.Strings_RU.buttonHelp,
                Image       = new BitmapImage(GetImageUri("Info.png"))
            };
            #endregion

            #region Молния
            var thunderbolt1 = new ToolBarInstantCommand(
                () =>
            {
                UserActionsManager.RegisterInfo(Strings.Strings_RU.stage1ThunderCall);
                CurrentGraph.Vertices.ForEach(v1 =>
                                              CurrentGraph.Vertices.ForEach(v2 =>
                {
                    if (!v1.Equals(v2) && CurrentGraph[v1, v2] == null && GivenGraph[
                            GivenGraph.Vertices.Single(v1.Equals),
                            GivenGraph.Vertices.Single(v2.Equals)] == null)
                    {
                        CurrentGraph.AddEdge(new UndirectedEdge((Vertex)v1, (Vertex)v2));
                    }
                    if (!v1.Equals(v2) && CurrentGraph[v1, v2] != null && GivenGraph[
                            GivenGraph.Vertices.Single(v1.Equals),
                            GivenGraph.Vertices.Single(v2.Equals)] != null)
                    {
                        CurrentGraph.RemoveEdge(CurrentGraph[v1, v2]);
                    }
                }
                                                                            ));
            },
                () => _state == State.Nothing
                )
            {
                Description = "Молния",
                Image       = new BitmapImage(GetImageUri("thunder.png"))
            };
            #endregion
            #endregion

            #region Второй этап
            #region Добавление вершин

            var vertexDialogCommand = new ToolBarInstantCommand(
                () =>
            {
                var dialog = new VertexDialog((UndirectedGraph)CurrentGraph, GivenGraph.Vertices);
                dialog.Show();
                dialog.Closed += (sender, args) =>
                {
                    var buf      = CurrentGraph;
                    CurrentGraph = null;
                    CurrentGraph = buf;
                };
            },
                () => _state == State.Nothing)
            {
                Image       = new BitmapImage(GetImageUri("Vertexes.png")),
                Description = Strings.Strings_RU.buttonVertexDialog
            };
            #endregion

            #region Добавление рёбер
            var phase2AddEdgeCommand = new ToolBarToggleCommand(
                () =>
            {
                IsMouseVerticesMovingEnabled = false;
                IsEgesAddingEnabled          = true;
                _state = State.EdgesAdding;
            },
                () =>
            {
                IsMouseVerticesMovingEnabled = true;
                IsEgesAddingEnabled          = false;
                _state = State.Nothing;
            },
                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("Arrow.png")),
                Description = Strings.Strings_RU.buttonEdges
            };
            #endregion

            #region Добавление подграфов
            var subgraphCommand = new ToolBarInstantCommand(
                () =>
            {
                var subgraph = true;
                var unique   = Unique((UndirectedGraph)CurrentGraph, GraphLib.Lib);
                var gp       = new GraphPrinter();
                UserActionsManager.RegisterInfo(Strings.Strings_RU.stage2Check + gp.GraphToString(CurrentGraph));
                CurrentGraph.Vertices.ForEach(v1 =>
                {
                    CurrentGraph.Vertices.ForEach(v2 =>
                    {
                        subgraph &= v1.Equals(v2) || (CurrentGraph[v1, v2] == null ^ GivenGraph[
                                                          GivenGraph.Vertices.Single(v1.Equals),
                                                          GivenGraph.Vertices.Single(v2.Equals)] != null);
                    }
                                                  );
                }
                                              );
                if (CurrentGraph.VerticesCount == 0)
                {
                    return;
                }
                if (!subgraph)
                {
                    UserActionsManager.RegisterMistake(Strings.Strings_RU.stage2Mistake1, 10);
                    return;
                }

                if (!unique)
                {
                    UserActionsManager.RegisterMistake(Strings.Strings_RU.stage2Mistake2, 10);
                    return;
                }

                var newGraph = UndirectedGraph.CreateEmpty(CurrentGraph.VerticesCount);
                for (var i = 0; i < CurrentGraph.VerticesCount; i++)
                {
                    for (var j = i + 1; j < CurrentGraph.VerticesCount; j++)
                    {
                        if (CurrentGraph[CurrentGraph.Vertices[i], CurrentGraph.Vertices[j]] != null)
                        {
                            newGraph.AddEdge(new UndirectedEdge(newGraph.Vertices[i], newGraph.Vertices[j]));
                        }
                    }
                }
                UserActionsManager.RegisterInfo(Strings.Strings_RU.stage2Subgraph);

                GraphLib.Lib.Add(newGraph);
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("Collection.png")),
                Description = Strings.Strings_RU.buttonCheckSubgraph
            };
            #endregion

            #region Справка
            var phase2HelpCommand = new ToolBarInstantCommand(
                () =>
            {
                new SimpleDialog("Справка", Strings.Strings_RU.stage2Help).Show();
            },
                () => _state == State.Nothing
                )
            {
                Description = Strings.Strings_RU.buttonHelp,
                Image       = new BitmapImage(GetImageUri("Info.png"))
            };
            #endregion

            #region Молния
            var thunderbolt2 = new ToolBarInstantCommand(
                () =>
            {
                UserActionsManager.RegisterInfo(Strings.Strings_RU.stage2ThunderCall);
                allSubgraphs.ForEach(s =>
                {
                    if (Unique(s, GraphLib.Lib))
                    {
                        GraphLib.Lib.Add(s);
                    }
                });
                var g = UndirectedGraph.CreateEmpty(GivenGraph.VerticesCount);
                for (var i = 0; i < g.VerticesCount; i++)
                {
                    for (var j = i + 1; j < g.VerticesCount; j++)
                    {
                        if (GivenGraph[GivenGraph.Vertices[i], GivenGraph.Vertices[j]] != null)
                        {
                            g.AddEdge(new UndirectedEdge(g.Vertices[i], g.Vertices[j]));
                        }
                    }
                }
                GraphLib.Lib.Add(g);
            },
                () => _state == State.Nothing
                )
            {
                Description = "Молния",
                Image       = new BitmapImage(GetImageUri("thunder.png"))
            };
            #endregion

            #region Завершить этап
            var phase2Command = new ToolBarInstantCommand(
                () =>
            {
                if (GraphLib.Lib.Count > allSubgraphs.Count)
                {
                    UserActionsManager.RegisterInfo(Strings.Strings_RU.stage2Done);
                    UserActionsManager.ReportThatTaskFinished();
                }
                else
                {
                    UserActionsManager.RegisterMistake(Strings.Strings_RU.stage2Mistake3, 10);
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("Check.png")),
                Description = Strings.Strings_RU.stage2DoneButtonDisc
            };
            #endregion
            #endregion

            Phase1ToolBarCommands = new ObservableCollection <ToolBarCommandBase>
            {
                phase1AddEdgeCommand,
                phase1Command,
                phase1HelpCommand
                #if DEBUG
                ,
                thunderbolt1
                #endif
            };
            Phase2ToolBarCommands = new ObservableCollection <ToolBarCommandBase>
            {
                vertexDialogCommand,
                phase2AddEdgeCommand,
                subgraphCommand,
                phase2Command,
                phase2HelpCommand
                #if DEBUG
                ,
                thunderbolt2
                #endif
            };
        }