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

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

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

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

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

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

// Создание путей
rt1 = new RailwayTrack();
rt1.startDrawing(50, 150, 0);
rt1.lineTo(450, 150, 0);

rt2 = new RailwayTrack();
rt2.startDrawing(450, 150, 0);
rt2.lineTo(900, 150, 0);

rt3 = new RailwayTrack();
rt3.startDrawing(450, 150, 0);
rt3.lineTo(900, 100, 0);

rt4 = new RailwayTrack();
rt4.startDrawing(450, 150, 0);
rt4.lineTo(900, 200, 0);

// Создание стрелки
RailwaySwitch rs = new RailwaySwitch();
rs.setTracks(rt1, rt2, rt3, rt4);
rs.setAllToAllType();

// Создание точки ж/д пути
pt = new PositionOnTrack();
pt.setPointOnTrack(rt1, 200);

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

// Добавление путей, стрелки и точки ж/д пути в сеть
rn.addAll( rt1, rt2, rt3, rt4, pt, rs );

// Добавление и инициализация уровня
Level level = new Level( this , "myLevel" , SHAPE_DRAW_2D3D, 0 );
level.add( rn );
level.initialize(); // Дальнейшие изменения в ж/д узле невозможны после вызова этой функции!

// Добавление уровня в группу presentation, чтобы он стал видимым в ходе выполнения модели
presentation.add( level );

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

Сначала мы создадим четыре железнодорожных пути. После объявления каждого нового пути, мы используем функцию startDrawing(), чтобы задать X-Y-Z координаты начальной точки пути, и функцию lineTo(), чтобы создать линейный сегмент ж/д пути. В качестве аргументов этой функции мы передаем X-Y-Z координаты конечной точки пути и таким образом рисуем линейный сегмент.

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

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

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

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

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

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

Добавление элементов в узел

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

Добавление и инициализация уровня

Мы используем конструктор Level, чтобы передать ссылку на агента (this), внутрь которого будет помещен уровень, указать имя узла ("myLevel"), задать режим отображения (2D, 3D или оба режима) и Z-координату уровня.

Затем мы добавляем в уровень ранее созданный узел, передав его в качестве аргумента функции add().

Чтобы инициализировать уровень, мы вызываем его функцию initialize(). Обратите внимание, что после вызова этой функции дальнейшие изменения в созданном узле уже невозможны.

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

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