Инструменты пользователя

Инструменты сайта


Боковая панель

developers:tutorial:algedit

Это старая версия документа.


Редактирование плана и профиля

Редактирование плана

План линии (или план трассы) является экземпляром класса PlanLine. Получить план линии можно с помощью свойства Plan класса Alignment (описание класса Alignment представлено в предыдущем разделе руководства Выбор модели подобъекта и преобразование координат). План линии представляет из себя упорядоченную коллекцию вершин плана линии (Vertex). Изменение плана линии осуществляется с помощью следующих методов класса PlanLine:

  • Add() - добавление новой вершины в конец плана линии
  • Clear() - удаление всех вершин плана линии
  • Insert() - вставка новой вершины в определённое место в описании плана линии
  • Remove() - удаление вершины плана линии
  • RemoveAt() - удаление вершины плана линии по её индексу

Вершины плана линии

Вершина плана линии является экземпляром класса Vertex. Она представляет из себя упорядоченную коллекцию элементов вершин плана линии (VertexItem), а также хранит в себе следующую информацию о её состоянии:

  • Beta - угол поворота вершины плана линии в радианах
  • P - расстояние от начала трассы до вершины плана линии
  • PlanData - геометрические показатели вершины плана линии
  • Position - плановое положение вершины плана линии

Вершины плана линии создаются с помощью конструктора класса Vertex() и добавляется в PlanLine. Изменение коллекции элементов вершин осуществляется методами аналогично тем, что описаны выше для работы с планом линии.

Если вершина не содержит ни одного элемента, то она является изломом плана линии. Если вершина содержит только один элемент, то она представляет из себя однорадиусную кривую. Если элементов больше одного, то это многорадиусная кривая.

Элемент вершины плана линии

Элемент вершины плана линии являются структурами VertexItem. Непосредственное изменение VertexItem не приведёт к изменению плана линии. То есть, если вы хотите изменить существующий элемент вершины плана линии, то вам необходимо заменить существующий элемент вершины аналогично тому, как это осуществляется при работе с массивами. Рассмотрим пример изменения радиуса существующего элемента вершины плана линии.

var vertex = Alignment.Plan[i]; // получение вершины плана линии
var item = vertex[j]; // получение элемента вершины плана линии
item.R = 500; // изменение радиуса вершины плана линии
vertex[j] = item; // замена существующего элемента вершины плана линии на изменённый

Элемент вершины плана линии создаётся с помощью конструктора VertexItem() и добавляется в Vertex. Состояние элемента вершины плана линии описывается следующими свойствами:

  • K - доля угла вершины плана линии (Vertex.Beta)
  • L1 - входная переходная кривая
  • L2 - выходная переходная кривая
  • R - радиус круговой кривой

Подготовка модуля

Создайте и настройте новый модуль для подключения к программному комплексу Топоматик Робур.

С помощью диалогового окна Менеджер ссылок добавьте ссылки на следующие библиотеки:

Для получения текущей модели подобъекта воспользуемся ресивером текущего подобъекта через метод CreateReciver() статического класса ActiveAlignmentReciver. Свойство Alignment ресивера вернёт Alignment текущего подобъекта или последнего активного подобъекта, если в данный момент активна модель отличная от подобъекта и активирует её.

Добавление элемента вершины плана линии в однорадиусную кривую

В этом примере укажем точку на плане, определим ближайшую к этой точке вершину плана линии и если это вершина является однорадиусной кривой, то добавим к ней новый элемент вершины плана линии.

Укажем точку на плане и определим расстояние от начала трассы до этой точки аналогично тому, как описано в предыдущем разделе руководства Выбор модели подобъекта и преобразование координат. Далее определим ближайшую к этой точке вершину плана линии с помощью метода SearchNearest() класса PlanLine и если у эта вершина содержит один элемент, то добавим в неё ещё один.

С целью недопущения нарушения геометрии плана линии, изменению вершины плана линии должен предшествовать вызов метода BeginTransaction() у этой вершины. Внесённые изменения следует проверить на нарушение геометрии плана с помощью метода PlanVertexesValid() статического класса PlanLineSolver, передав ему PlanLine. Если проверка прошла успешно, то изменения вершины фиксируются вызовом метода Commit(). В противном случае изменения необходимо откатить методом Rollback(). Сами изменение следует производить в блоке try/finally.

В теле программного модуля объявите команду, и декорируйте её атрибутом «cmd». Команда «add_vertex_to_alignment» предложит пользователю указать точку на плане, определит ближайшую вершину плана линии и если эта вершина содержит только один элемент, то в вершину будет добавлен новый элемент.

...
    [cmd("add_vertex_to_alignment")]
    private void AddVertexToAlignment()
    {
        //Получаем модель текущей трассы. Если текущей является не трасса, то активируется последняя активная трасса
        Alignment alignment;
        using (var receiver = ActiveAlignmentReciver<Alignment>.CreateReciver(false))
        {
            alignment = receiver.Alignment;
            if (alignment == null)
            {
                MessageDlg.Show("Последний активный подобъект не найден.", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                return;
            }
 
            var cadview = CadView;
            if (cadview == null) return;
 
            var plan = alignment.Plan;
            var compound = plan.CompoundLine;
 
            //Указываем однорадиусную кривую
            Vector3D point;
            var getPointRes = CadCursors.GetPoint(cadview, out point, "Укажите однорадиусную кривую:");
            if (!getPointRes) return;
 
            double station, offset;
            var res = compound.PosToStaOffset(point.Pos, out station, out offset);
            if (!res)
            {
                MessageDlg.Show("Указанная точка лежит вне плана линии.", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                return;
            }
 
            //Получаем ближайшую вершину угла к указанной точке и добавляем в неё элемент
            var vertex = plan.SearchNearest(station);
 
            if (vertex.Count != 1)
            {
                MessageDlg.Show("Необходимо указать однорадиусную кривую.", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                return;
            }
 
            vertex.BeginTransaction();
            var result = true;
            try
            {
                var angle = Math.Abs(vertex.Beta);
                var item1 = vertex[0];
                var item2 = new PlanLine.Vertex.VertexItem { R = item1.R, L2 = item1.L2, K = angle * 0.5 };
                item1.L2 = 0.0;
                item1.K = angle * 0.5;
                vertex[0] = item1;
                vertex.Add(item2);
                result = PlanLineSolver.PlanVertexesValid(plan);
            }
            finally
            {
                if (result)
                {
                    vertex.Commit();
                }
                else
                {
                    vertex.Rollback();
                    MessageDlg.Show("При разбивке кривой произошла ошибка.", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                }
            }
        }
    }
...

developers/tutorial/algedit.1657490219.txt.gz · Последние изменения: 2022/07/10 21:56 — proxor