Пример #1
0
        /// <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;
        }
Пример #2
0
        /// <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;
        }