Иногда вам может понадобиться создать сеть с помощью программного кода. Обратите внимание, что такой код можно выполнить только при запуске модели, а созданную программно сеть нельзя отредактировать.
Демо-модель: 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. Для этого мы вызываем функцию add() объекта presentation в качестве действия При запуске агента Main (в секции свойств Действия агента) и передаем созданный нами уровень (myLevel) в качестве аргумента.
-
Как мы можем улучшить эту статью?
-