
Используется при моделировании транспортных сетей. Моделирует два стоящих друг напротив друга стеллажа и проход между ними. Объект NetworkStorage создает набор узлов и сегментов вдоль заданного прохода, добавляет их в существующую сеть и управляет заявками, хранящимися по обе стороны от прохода (возможно, на разных уровнях, расположенных друг над другом).
Чтобы задать такую структуру из двух стеллажей и прохода между ними, Вам нужно нарисовать три прямоугольника: узел у начала прохода, фигуру прохода и узел у конца прохода. Оба узла должны принадлежать сети (входить в состав группы фигур сети), а фигура прохода, наоборот, не должна.
Параметр Количество мест в ряду определяет, сколько узлов сети будет создано на каждой стороне прохода; каждый узел фактически является проекцией набора вертикально расположенных ячеек (их количество задается параметром Количество уровней). Следовательно, такой объект с 60 местами в ряду и 4 уровнями будет иметь 60 * 4 * 2 = 480 ячеек, где коэфффициент 2 означает, что по каждую сторону от прохода будет создано по стеллажу. У каждой ячейки есть координаты: ряд (0..1), место (0..npositions-1) и уровень (0..nlevels-1).
Объект создает сегмент сети, идущий по центральной оси прохода и соединяющий узел у начала прохода с узлом у конца прохода. Между каждой парой расположенных друг напротив друга узлов - проекций ячеек - NetworkStorage создает сегмент, соединяющий эти узлы с маленьким узлом, создаваемым на ранее созданном сегменте сети, идущем вдоль прохода, так что все эти узлы подсоединяются к сети.
Ряды стеллажей могут располагаться на плане как вертикально, так и горизонтально; это определяется прямоугольником - фигурой прохода (если его ширина больше его высоты, то ряды будут горизонтальными, и наоборот). Ширина узлов, сответствующих ячейкам вычисляется автоматически как длина прохода, поделенная на количество мест в ряду. Глубина ячейки задается пользователем. Глубина соответствующего ячейке узла сети, топология проходов и нарисованных пользователем элементов сети должны согласовываться друг с другом, то есть, например, эти элементы не должны пересекаться.
NetworkStorage может проводить с ячейкой следующие операции:
Объект NetworkStorage предоставляет набор методов, позволяющих получить информацию о его состоянии: вместимость, количество занятых, зарезервированных и свободных ячеек, статистика использования и т.д. Вы можете осуществлять поиск заявки в хранилище, определять ближайшую свободную к началу или концу прохода ячейку, определять, какой узел сети соответствует ячейке и т.д. Поскольку у Вас есть доступ к узлам сети, Вы можете отражать состояние соответствующих ячеек (занята, зарезервирована, свободна) с помощью цветов.
Обычно для заявки, которая должна быть помещена на хранение, выполняется следующий алгоритм:
Обратите внимание, что объект NetworkStorage не запоминает, какая именно заявка зарезервировала ячейку, так что проверка того, та ли самая заявка, что резервировала ячейку, была туда впоследствии помещена, входит в компетенцию пользователя.
Для заявки, которая должна быть извлечена из ячейки, в свою очередь, выполняется следующий алгоритм:
Вы можете работать с сожержимым хранилища с помощью программного интерфейса, но намного проще будет использовать специально созданные для этого объекты NetworkStoragePut и NetworkStoragePick.
Объект позволяет пользователю задавать любые действия, которые он хочет выполнить в значимые моменты работы объекта (при помещении заявки в ячейку, при резервироании ячейки и т.д.).
Если в Вашей модели есть некая общая зона хранения, состоящая из набора стеллажей, используемых в сходной манере, имеет смысл задать ее с помощью объекта NetworkStorageZone, предоставляющего централизованный доступ и управление этими стеллажами.
Поскольку NetworkStorage изменяет структуру сети, то он требует вызова метода refreshNetwork() объекта Network для того, чтобы заново составить таблицы маршрутизации и т.д. Но если в Вашей модели слишком много таких объектов, и каждый из них будет во время инициализации будет заново перестраивать всю сеть, то это может занять достаточно много времени. Вам же достаточно будет просто обновить сеть один раз, после того, как все эти объекты будут созданы. В этом случае Вы можете отключить обновление сети отдельными стеллажами (с помощью параметра Обновлять сеть при запуске) и вызывать метод network.refreshNetwork(), например, в действии события, запланированного на момент времени 0.
int capacity() - возвращает вместимость объекта, равной 2*npositions*nlevels
boolean contains(T entity) - проверяет, содержат ли данные стеллажи заявку entity.
T get(int row, int position, int level) - возвращает заявку, хранящуюся в ячейке с заданными координатами [ряд row, место position, уровень level] (или null, если эта ячейка зарезервирована или свободна).
T getByIndex(int index) - возвращает заявку с заданным номером index. Порядок заявок определяется объектом и может изменяться при добавлении и удалении заявок. Если index+1 больше, чем количество заявок, то метод возвращает null.
int[] getCellOf(T entity) - возвращает массив координат [ряд row, место position, уровень level] ячейки, содержащей заявку entity, или null, если такая заявка здесь не хранится.
int[] getFreeCell(boolean infront) - возвращает массив координат [ряд row, место position, уровень level] свободной ячейки, ближайшей к началу или концу стеллажа, в зависимости от значения параметра infront. Если стеллажи переполнены, возвращает null.
ShapeRectangle getLocationInAisle(int row, int position) - возвращает узел сети, расположенный в проходе перед ячейкой с заданными координатами [ряд row, место position] (уровень не имеет значения, поскольку ячейки, располагающиеся одна над другой, имеют один и тот же узел).
ShapeRectangle getLocationOfCell(int row, int position) - возвращает узел сети, соответствующий ячейке с заданными координатами [ряд row, место position] (уровень не имеет значения, поскольку ячейки, располагающиеся одна над другой, имеют один и тот же узел).
T getRandom() - возвращает случайную заявку из стеллажей, моделируемых данным объектом или null, если в них не хранится ни одной заявки.
boolean hasSpace() - проверяет, есть ли свободное место в стеллажах, моделируемых данным объектом, т.e. есть ли незанятые и незарезервированные ячейки.
boolean isFree(int row, int position, int level) - проверяет, свободна ли ячейка [ряд row, место position, уровень level]. Свободной считается не занятая и не зарезервированная ячейка.
boolean isReserved(int row, int position, int level) - проверяет, зарезервирована ли ячейка [ряд row, место position, уровень level].
void put(int row, int position, int level, T entity) - Помещает заявку entity в ячейку [ряд row, место position, уровень level]. Если ячейка занята, выдает ошибку. Не проверяет ячейку на предмет резервирования.
void release(int row, int position, int level) - отменяет резервирование ячейки [ряд row, место position, уровень level]. Ячейка должна быть зарезервирована.
T remove(T entity) - извлекает заявку entity из стеллажей, моделируемых данным объектом, и возвращает ее. Если такая заявка не хранится, то возвращает null.
T removeFromCell(int row, int position, int level) - извлекает заявку из заданной ячейки [ряд row, место position, уровень level] и возвращает ее.
void reserve(int row, int position, int level) - помечает ячейку [ряд row, место position, уровень level] как зарезервированную. При этом яечйка должна быть свободной.
int reserved() - возвращает количество зарезервированных ячеек в текущий момент.
void resetStats() - удаляет статистику, собранную объектом к текущему моменту времени.
int size() - возвращает количество заявок, находящихся в стеллажах, моделируемых данным объектом, в текущий момент.