Программное создание сети

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

Демо модель: Create Transporter Network by Code

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

Чтобы создать сеть программно, мы создаем функцию, в теле которой вводим Java код, который создает сеть, помещает ее на уровень и инициализирует уровень. В демонстрационной модели мы используем следующий код:

// Создать прямоугольный узел с аттрактором внутри
rn = new RectangularNode();
rn.setPos(300.0, 350.0, 0.0);
rn.setSize(100.0, 90.0);
rn.addAttractor(
new Attractor(25.0, 25.0, 4.7));

// Создать точечный узел
pn = new PointNode();
pn.setRadius(5);
pn.setLineColor(dodgerBlue);
pn.setPos(50.0, 300.0);

// Создать путь между узлами
Path path = new Path( );
path.setBidirectional(
true);
path.addSegment(
new MarkupSegmentLine(50.0, 300.0, 0.0, 350.0, 300.0, 0.0));
path.addSegment(new MarkupSegmentLine(350.0, 300.0, 0.0, 350.0, 350.0, 0.0));
path.setTarget(rn);
path.setSource(pn);

// Создать сеть, в которую входят узлы и путь, созданные ранее
n = new Network( this , "MyNetwork");
n.addAll(rn, pn, path) ;

// Создать и инициализировать уровень, который содержит сеть
Level level = new Level(this, "MyLevel", SHAPE_DRAW_2D3D, 0);
level.add(n);
level.initialize();
// Нельзя вносить изменения после инициализации!

return level;

Создание прямоугольного узла с аттрактором

Сначала мы создадим прямоугольный узел и укажем его местоположение и размеры. Местоположение задается функцией узла setPos(), где в качестве аргументов мы передаем X-Y-Z координаты верхнего левого угла прямоугольного узла. Чтобы задать размер, мы передаем ширину и высоту прямоугольного узла в радианах в качестве аргументов функции узла setSize().

Затем мы используем функцию addAttractor(), чтобы создать в узле аттрактор. В качестве аргументов мы передаем X-Y координаты аттрактора и его ориентацию (угол в радианах). Обратите внимание, что нас нет необходимости указывать аттрактор в качестве места назначения в блоке MoveByTransporter, поскольку при наличии аттрактора в узле транспортер в любом случае будет двигаться именно к нему.

Создание точечного узла

Далее мы создадим точечный узел и укажем его радиус, цвет линии и местоположение. Местоположение задается с помощью X-Y координат центра точечного узла.

Создание пути между узлами

Теперь мы создадим путь и укажем, что движение по нему может осуществляться в обе стороны. Для этого мы используем функцию пути setBidirectional() и передаем true в качестве аргумента bidirectional.

Путь состоит из двух сегментов. Мы добавим их в порядке размещения от начальной точки пути. Каждый сегмент пути создается с помощью функции пути addSegment(), аргументом которой служит конструктор MarkupSegmentLine. Этот конструктор в свою очередь принимает шесть аргументов: X, Y и Z-координаты начальной и конечной точек сегмента.

После этого мы указываем ссылки на начальные и конечные узлы созданного нами пути: setTarget(rn) и setSource(pn).

Создание сети

Мы указали все необходимые для создания сети элементы. Далее в качестве аргументов конструктора Network мы передаем ссылку на агента (this), внутрь которого будет добавлена сеть, и указываем имя сети ("myNetwork").

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

n.addAll(rn, pn, path);

Создание и инициализация уровня

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

Level level = new Level(this, "MyLevel", SHAPE_DRAW_2D3D, 0);

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

В качестве последнего шага мы указываем, что функция должна вернуть созданный уровень.

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

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