public static void ResizeCanvas(List <PetriNetNode> figures, PNEditorControl control, Canvas canvas) { var xMargin = control.ActualWidth - control.GridMainField.ActualWidth + 20; var yMargin = control.ActualHeight - control.GridMainField.ActualHeight + 40; if (figures.Count == 0) { return; } var maxX = figures[0].CoordX; var maxY = figures[0].CoordY; foreach (var figure in figures) { if (figure.CoordX > maxX) { maxX = figure.CoordX; } if (figure.CoordY > maxY) { maxY = figure.CoordY; } } double canvasHeight, canvasWidth; if (maxY + 50 >= control.ActualHeight - yMargin) { canvasHeight = maxY + 120; } else { canvasHeight = control.ActualHeight - yMargin; } if (maxX + 30 >= control.ActualWidth - xMargin) { canvasWidth = maxX + 80; } else { canvasWidth = control.ActualWidth - xMargin; } canvas.Height = canvasHeight; canvas.Width = canvasWidth; }
//todo А почему в ArrangePetriNetModel используем MoveFigure, тогда как в ArrangeMulticlusterGraph прекрасно обходимся без него?! public void ArrangePetriNetModel(List <PetriNetNode> allFigures, IList <VArc> arcs, PNEditorControl control) { var PNEditorControl = new { Mode = new { Graph = 1, PetriNet = 2 } }; var editorMode = 2; if (allFigures.Count == 0) { return; } foreach (var figure in allFigures) { figure.Column = 0; figure.IsChecked = false; figure.ModelNumber = 0; } SetColumnsForStartFigures(allFigures); NextColumn(allFigures); int modelNumber = 0; int numberOfFiguresChecked = 0; while (numberOfFiguresChecked != allFigures.Count) { PetriNetNode next = allFigures[0]; modelNumber++; foreach (PetriNetNode figure in allFigures) { if (figure.IsChecked == false) { next = figure; next.ModelNumber = modelNumber; next.IsChecked = true; break; } } DepthFirstSearch(next, next.ModelNumber); numberOfFiguresChecked = allFigures.Count(t => t.IsChecked); } int numberOfModels = allFigures.Select(t => t.ModelNumber).Concat(new[] { 1 }).Max(); List <PetriNetNode> figuresInOneModel = new List <PetriNetNode>(); double spaceBetweenColumnsCoefficient = 1; int maxNumberOfColumnsInAllModels = 1; if (editorMode == PNEditorControl.Mode.Graph) { ArrangeMulticlusterGraph(numberOfModels, figuresInOneModel, allFigures, arcs); foreach (PetriNetNode figure in allFigures) { control.MoveFigure(figure); //todo это ужас, конечно. надо нормально декомпозировать и убрать } } else { if (editorMode != PNEditorControl.Mode.PetriNet) { return; //todo нехорошо, в общем-то, привязки лишние } double maxYinModel = 0; for (int n = 1; n < numberOfModels + 1; n++) { List <PetriNetNode> modelFigures; int maxNumberOfRows; int maxColumn; SearchColumnWithMaxNumberOfRows(n, allFigures, out maxNumberOfRows, out maxColumn, out modelFigures); var numbercolumns = NumberOfColumnsOfFiguresList(modelFigures); if (numbercolumns > maxNumberOfColumnsInAllModels) { maxNumberOfColumnsInAllModels = numbercolumns; } for (int i = 1; i < numbercolumns + 1; i++) { double coordY = GetCoordYOfFirstFigureInColumn(maxNumberOfRows, i, modelFigures) + maxYinModel; List <PetriNetNode> thisColumn = modelFigures.Where(t => t.Column == i).ToList(); if (thisColumn.Count != 0) { if (thisColumn[0] is VPlace) { thisColumn[0].CoordY = coordY + 10; } else { thisColumn[0].CoordY = coordY; } } int numberOfArcsInColumn = 0; for (int k = 1; k < thisColumn.Count; k++) { thisColumn[k].CoordY = thisColumn[k - 1].CoordY + 70; } foreach (PetriNetNode figure in thisColumn) { numberOfArcsInColumn = figure.ThisArcs.Count(t => (t.To.Column > t.From.Column && figure == t.From) || (t.From.Column > t.To.Column && figure == t.To)); figure.SpaceCoefficient = spaceBetweenColumnsCoefficient; } spaceBetweenColumnsCoefficient = GetSpaceBetweenColumnsCoefficientMagically(numberOfArcsInColumn); } maxYinModel = modelFigures.Select(t => t.CoordY).Concat(new[] { maxYinModel }).Max(); maxYinModel += 60; //todo magic number spaceBetweenColumnsCoefficient = 1; } //todo вот тут не норм, подумать как для разных моделей свои раастояния рассчитывать for (int p = 1; p < maxNumberOfColumnsInAllModels + 1; p++) { foreach (PetriNetNode figure in allFigures) { if (figure.Column == p) { //TODO здесь нужно как-то вообще убрать эту временную переменную PetriNetNode tempF = PetriNetNode.Create(); foreach (PetriNetNode f in allFigures) { if (f.Column == figure.Column - 1) { tempF = f; break; } } double lyambda; if (tempF is VPlace || tempF is VTransition) { lyambda = tempF.CoordX - 10; } else { lyambda = -60; } figure.CoordX = 10 + lyambda + 60 * figure.SpaceCoefficient; } control.MoveFigure(figure); //todo это ужас, конечно. надо нормально декомпозировать и убрать } } } }
public void BindMainControl(PNEditorControl mainControl) { _mainControl = mainControl; }