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); }
/// <summary> Проверка матрицы </summary> private void CheckMatrix() { var counter = new MatrixErrorCounter(); var amount = counter.CountOfErrorsMatrix(Matrix, GivenGraph); if (amount > 0) { short k = (short)((short)amount * 3); string mistake = null; switch (amount) { case 1: mistake = "Найдена " + amount + " ошибка"; break; case 2: case 3: case 4: mistake = "Найдено " + amount + " ошибки"; break; default: mistake = "Найдено " + amount + " ошибок"; break; } if (UserActionsManager.Score > k) { UserActionsManager.RegisterMistake(mistake, k); } else if (UserActionsManager.Score > 0) { UserActionsManager.RegisterMistake(mistake, (short)UserActionsManager.Score); } } else { UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание выполнено, переход к следующему заданию"); MessageBox.Show("Задание 1.1 пройдено.\n Вы перешли к заданию 1.2.\n Ознакомьтесь со справкой.<?>"); _task = Task.TaskModifiedAdjMatrix; } }
//добавление-удаление /// <summary> Инициализация </summary> protected override void OnInitialized() { base.OnInitialized(); InitToolBarCommands(); OnLoadedCmd = new DelegateCommand( o => { VariantProvider.DownloadVariantAsync(); ToolBarCommands.ForEach(c => c.RefreshState()); }, o => true); var outV = new Vertex("a"); VertexClickCmd = new DelegateCommand( o => { if (_state == State.AddEdge1) { outV = GivenGraph.Vertices.Single(v => v.Name == ((IVertex)o).Name) as Vertex; VertVisCol.Single(v => v.Name == outV.Name).Radius = 23; VertVisCol.Single(v => v.Name == outV.Name).Background = new SolidColorBrush(Colors.Magenta); UserActionsManager.RegisterInfo(string.Format("Выходная вершина - [{0}]. Выберите входную вершину.", ((IVertex)o).Name)); _state = State.AddEdge2; return; } if (_state == State.AddEdge2) { var inV = GivenGraph.Vertices.Single(v => v.Name == ((IVertex)o).Name) as Vertex; UserActionsManager.RegisterInfo(string.Format("Входная вершина - [{0}]. Добавьте другое ребро или выйдете из режима добавления ребер", ((IVertex)o).Name)); var newEdge = new DirectedEdge(outV, inV); if (GivenGraph.Edges.Any(newEdge.Equals)) { ReportMistake("Указанная дуга уже существует."); return; } VertVisCol.Single(v => v.Name == outV.Name).Radius = 20; VertVisCol.Single(v => v.Name == outV.Name).Background = new SolidColorBrush(Colors.LightGray); GivenGraph.AddEdge(newEdge); _state = State.AddEdge1; } if (_state == State.RemoveVertex) { GivenGraph.RemoveVertex(GivenGraph.Vertices.Single(v => v.Name == ((IVertex)o).Name)); UserActionsManager.RegisterInfo(string.Format("Вершина [{0}] удалена со всеми связями", ((IVertex)o).Name)); } }, o => true); VisualizerClickCmd = new DelegateCommand( o => { if (_state == State.AddVertex) { UserActionsManager.RegisterInfo((string.Format("Вершина добавлена"))); var vertex = (Graphs.UIComponents.Visualization.Vertex)o; vertex.Name = (GivenGraph.VerticesCount).ToString(); int i = 0; while (GivenGraph.Vertices.Any(vertex.Equals)) { i = i + 1; vertex.Name = (i).ToString(); } } }, o => true); }
/// <summary> Клик по вершине </summary> public void OnVertexClick(IVertex vertex) { UserActionsManager.RegisterInfo(string.Format("Клик по вершине [{0}]", vertex.Name)); }
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>(); // Перемещение вершин - 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() { 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); }
/// <summary> /// Проверка выбранного множества на соответствие наименьшему множеству внешней устойчивости /// </summary> private void IsMinDS() { var numofChosen = 0; foreach (var sccRow in MdsRows) { if (sccRow.IsBuilt) { numofChosen++; } } // мощность выбранного множества foreach (var realSccRow in RealMdsRows) { foreach (var sccRow in MdsRows) { if (sccRow.IsBuilt) { var tempSize = 0; for (int i = 0; i < realSccRow.VerticesSet.Count; i++) { for (int j = 0; j < sccRow.VerticesSet.Count; j++) { if (realSccRow.VerticesSet[i].Name == sccRow.VerticesSet[j].Name) { tempSize++; } if ((tempSize == realSccRow.VerticesSet.Count) && (realSccRow.VerticesSet.Count == sccRow.VerticesSet.Count)) { realSccRow.IsBuilt = true; } } } } } } var flag = true; var flag2 = true; var k = ""; var numOfBuilt = 0; var m = 0; foreach (var realSccRow in RealMdsRows) { if (realSccRow.IsBuilt) { numOfBuilt++; } else { flag = false; k = k + realSccRow.VerticesView; m = m + 5; } } if (numOfBuilt != numofChosen) { flag2 = false; } if (flag && flag2) { UserActionsManager.RegisterInfo("Внешняя устойчивость.Задание 3. Задание выполнено"); MessageBox.Show("Задание выполнено. Нажмите ещё раз кнопку ОК для выхода."); _task = Task.TaskEnd; UserActionsManager.ReportThatTaskFinished(); } else if (!flag2) { k = "Внешняя устойчивость. Задание 3. Выбранные множества не являются минимальными."; if (UserActionsManager.Score > 5) { UserActionsManager.RegisterMistake(k, 5); } else if (UserActionsManager.Score > 0) { UserActionsManager.RegisterMistake(k, (short)UserActionsManager.Score); } MessageBox.Show("Неправильно выбраны множества. Повторите выполнение 3 задания."); } else { k = "Внешняя устойчивость. Задание 3. Выбраны не все множества."; if (UserActionsManager.Score > m) { UserActionsManager.RegisterMistake(k, (short)m); } else if (UserActionsManager.Score > 0) { UserActionsManager.RegisterMistake(k, (short)UserActionsManager.Score); } MessageBox.Show("Неправильно выбраны множества. Повторите выполнение 3 задания."); } }
/// <summary> /// Проверка выбранного множества вершин на соответствие множеству внешней устойчивости /// </summary> /// <returns></returns> private bool ValidateSet() { var isAdded = false; var setChecker = new CheckSet(); bool isExternal = setChecker.IsExternalStability(DomSet, GivenGraph); var sccStr = new MdsRowViewModel(DomSet, _dsCount - _countOfSes + 1); var isMinimal = setChecker.IsMinimal(DomSet, GivenGraph); // какое множество проверяем UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание 2. На проверку отправлено множество: " + sccStr.VerticesView); if (isExternal) { if (isMinimal) { //Поиск выбранного множества в списке всех множеств ??? foreach (var sccRow in MdsRows) { if (sccRow.VerticesView == sccStr.VerticesView) { isAdded = true; break; } } //Проверка на уже добавленность выбранного множества if (isAdded) { MessageBox.Show("Множество " + sccStr.VerticesView + " уже добавлено."); if (UserActionsManager.Score > 2) { UserActionsManager.RegisterMistake("Множество " + sccStr.VerticesView + " уже добавлено.", 2); } else if (UserActionsManager.Score > 0) { UserActionsManager.RegisterMistake("Множество " + sccStr.VerticesView + " уже добавлено.", (short)UserActionsManager.Score); } } else { MdsRows.Add(sccStr); --_countOfSes; //Выбрано достаточное количество множеств внешней устойчивости if (_countOfSes == 0) { UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание 2 завершено. "); MessageBox.Show("Задание 2 пройдено.\n Вы перешли к заданию 3.\n Ознакомьтесь со справкой.<?>"); _task = Task.TaskFindMinDomSets; } if (UserActionsManager.Score > _countOfSes) { UserActionsManager.RegisterInfo(string.Format(@"Множество добавлено. Осталось {0} множеств(о).", _countOfSes)); } else if (UserActionsManager.Score > 0) { UserActionsManager.RegisterInfo(string.Format(@"Множество добавлено. Осталось {0} множеств(о).", UserActionsManager.Score)); } } //Очищаем текущее множество выбранных вершин DomSet.Clear(); //Визуальное изменение выбранных элементов foreach (var vertex in VertVisCol) { vertex.BorderBrush = new SolidColorBrush(_defaultBorderColor); vertex.Background = new SolidColorBrush(_defaultBackgroundColor); Matrix[Convert.ToInt32(vertex.Name)].Background = new SolidColorBrush(Color.FromArgb(250, 239, 240, 250)); } foreach (var edge in EdgeVisCol) { edge.Stroke = new SolidColorBrush(_defaultBorderColor); } } else { if (UserActionsManager.Score > 10) { UserActionsManager.RegisterMistake("Это множество вершин не является минимальным.", 10); } else if (UserActionsManager.Score > 0) { UserActionsManager.RegisterMistake("Это множество вершин не является минимальным.", (short)UserActionsManager.Score); } } } else { if (UserActionsManager.Score > 10) { UserActionsManager.RegisterMistake("Это множество вершин не является внешне устойчивым.", 10); } else if (UserActionsManager.Score > 0) { UserActionsManager.RegisterMistake("Это множество вершин не является внешне устойчивым.", (short)UserActionsManager.Score); } } return(true); }
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 }; }