/// <summary> /// Симметричное добавление шаблона к текущему шаблону /// </summary> /// <param name="destination">Текущий шаблон (шаблон назначения)</param> /// <param name="template">Образец присоединяемого шаблона</param> /// <exception cref="InvalidOperationException" /> public static void AppendSymmetric(this IRailwayTemplate destination, IRailwayTemplate template) { if (destination.Symmetric == null) { throw new InvalidOperationException("Отсутствует симметричная точка для назначенного шаблона"); } // Создаём копии шаблона var forward = template.Clone(); var backward = template.Clone(); // Добавляем шаблоны в две точки разрыва destination.Append(forward); destination.Symmetric.Append(backward); // Связываем добавленные блоки связью симметрии forward.Symmetric = backward; backward.Symmetric = forward; }
/// <summary> /// Размеры шаблона /// </summary> /// <param name="railway">Шаблон</param> /// <param name="shouldClone">Стоит ли клонировать объект</param> public TemplateDimensions(IRailwayTemplate railway, bool shouldClone = true) { var template = shouldClone ? railway.Clone() : railway; var railways = template.GetRailways(); var points = railways.Select(_ => _.Start).ToList(); points.AddRange(railways.Select(_ => _.End)); if (points.Count > 0) { Min = new Point(points.Min(_ => _.X), points.Min(_ => _.Y)); Max = new Point(points.Max(_ => _.X), points.Max(_ => _.Y)); } Output = new Point( template.End.X - template.Start.X, template.End.Y - template.Start.Y, template.End.Angle - template.Start.Angle); Width = Max.X - Min.X; Height = Max.Y - Min.Y; }