public void EvenSpaces(FigureArrange arrange) { OnLayerStartChanging(); _selection.EvenSpaces(arrange); _selection.PushTransformToSelectedFigures(); OnLayerChanged(); //строим маркеры UpdateMarkers(); }
/// <summary> /// Выравнивание по величине промежутков между фигурами /// </summary> /// <param name="selection">Текущее выделение фигур</param> /// <param name="arrange">Направление выравнивания</param> public static void EvenSpaces(this Selection selection, FigureArrange arrange) { var exists = selection.Count > 2; if (!exists) { return; } var width = 0f; var heigth = 0f; foreach (var bounds in selection.Select(figure => figure.GetTransformedPath().Path.GetBounds())) { width += bounds.Width; heigth += bounds.Height; } var selectionBounds = selection.GetTransformedPath().Path.GetBounds(); var figures = new List <Figure>(); switch (arrange) { case FigureArrange.Horizontal: var sW = (selectionBounds.Width - width) / (selection.Count - 1); figures.AddRange(selection.OrderBy(item => item.GetTransformedPath().Path.GetBounds().Left)); var w = selectionBounds.Left + figures.First().GetTransformedPath().Path.GetBounds().Width + sW; for (var i = 1; i < figures.Count - 1; i++) { var half = figures[i].GetTransformedPath().Path.GetBounds().Width / 2; w += half; var el = figures[i].Transform.Matrix.Elements; el[4] = w; figures[i].Transform.Matrix = new Matrix(el[0], el[1], el[2], el[3], el[4], el[5]); w += half + sW; } break; case FigureArrange.Vertical: var sH = (selectionBounds.Height - heigth) / (selection.Count - 1); figures.AddRange(selection.OrderBy(item => item.GetTransformedPath().Path.GetBounds().Top)); var h = selectionBounds.Top + figures.First().GetTransformedPath().Path.GetBounds().Height + sH; for (var i = 1; i < figures.Count - 1; i++) { var half = figures[i].GetTransformedPath().Path.GetBounds().Height / 2; h += half; var el = figures[i].Transform.Matrix.Elements; el[5] = h; figures[i].Transform.Matrix = new Matrix(el[0], el[1], el[2], el[3], el[4], el[5]); h += half + sH; } break; } }