Программное создание железнодорожного узла

Иногда вам может понадобиться создать железнодорожный узел с помощью программного кода. Обратите внимание, что такой код можно выполнить только при запуске модели, а созданную программно сеть нельзя отредактировать.

В этой статье мы рассмотрим следующую демонстрационную модель:

Демо модель: Create Rail Yard by Code

Рассмотрим пример создания ж/д узла, состоящего из трех ж/д путей, соединенных стрелкой. В этой сети мы также создадим элемент Точка ж/д пути, который будет задавать начальную позицию поездов на пути. Поезда появляются в сети на пути  rt1 и движутся либо по пути rt2, либо по пути rt3. Выбор пути движения осуществляется с помощью блока  диаграммы процессов SelectOutput.

Чтобы создать железнодорожный узел программно, введите следующий Java код в качестве действия При запуске агента Main (в секции свойств Действия агента). В демо модели мы используем следующий код:

// Создание сегментов
MarkupSegmentLine ms1 = new MarkupSegmentLine( 50, 50, 0, 600, 50, 0);
MarkupSegmentLine ms2 = new MarkupSegmentLine( 600, 50, 0, 900, 50, 0);
MarkupSegmentLine ms3 = new MarkupSegmentLine( 600, 50, 0, 900, 150, 0);

// Создание ж/д путей
rt1 = new RailwayTrack(this, SHAPE_DRAW_2D3D, true,
                                   PATH_RAILROAD, black, 2, ms1);
                                   
rt2 = new RailwayTrack(this, SHAPE_DRAW_2D3D, true,
                                   PATH_RAILROAD, black, 2, ms2);

rt3 = new RailwayTrack(this, SHAPE_DRAW_2D3D, true,
                                   PATH_RAILROAD, black, 2, ms3);

// Создание стрелки
RailwaySwitch rs = new RailwaySwitch( this, SHAPE_DRAW_2D3D, true,
                                   2, black, null, rt1, rt2, rt3 );

// Создание точки на пути
pt = new PositionOnTrack( this, SHAPE_DRAW_2D3D, true,
                                   black, rt1, 200);

// Создание сети
RailwayNetwork rn = new RailwayNetwork( this, "myRailwayNetwork",
                                   SHAPE_DRAW_2D3D, 0 );

// Инициализация сети
rn.addAll( rt1, rt2, rt3, rs, pt );

rn.initialize();

//Добавление на презентацию путей/стрелки/точки на пути 
presentation.add(rt1);
presentation.add(rt2);
presentation.add(rt3);
presentation.add(rs);
presentation.add(pt);

Создание сегментов разметки

Сначала мы создадим три линейных сегмента разметки. Для этого мы вызовем конструктор MarkupSegmentLine, который принимает шесть аргументов: X, Y и Z-координаты начальной и конечной точек сегмента.

Создание ж/д путей

Затем мы создадим три железнодорожных пути. Конструктор RailwayTrack принимает следующие аргументы:

Создание стрелки

С помощью конструктора RailwaySwitch мы создадим стрелку. Конструктор принимает практически тот же набор аргументов, что и конструктор RailwayTrack, но вместо сегментов разметки мы предоставляем ссылки на ж/д пути, которые соединяются с помощью этой стрелки (rt1, rt2, rt3).

Создание точки на пути

Подобным способом мы создаем и точку на пути. В качестве двух последних аргументов конструктора PositionOnTrack мы передаем ссылку на путь (rt1), на котором будет располагаться точка, и ее смещение относительно начала пути (200).

Создание узла

Мы указали все необходимые для создания узла элементы. В качестве аргументов конструктора RailwayNetwork мы передаем ссылку на агента (this), внутрь которого будет добавлен узел, указываем имя узла ("myRailwayNetwork"), задаем режим отображения (2D, 3D или оба режима) и Z-координату узла (в нашем случае это значение равно нулю).

Инициализация узла

Теперь мы добавим созданные элементы в ж/д узел, вызвав функциию сети addAll() и передав в качестве аргументов ссылки на ранее созданные элементы (ж/д пути, ж/д стрелку и точку на пути).

Чтобы инициализировать узел, мы вызываем функцию initialize() созданного узла rn.

Добавление элементов в группу presentation

Чтобы созданные нами элементы были видны во время выполнения модели, мы добавим их в группу presentation. Для этого мы вызовем функцию add() объекта presentation для каждого элемента ж/д узла.