
Чтобы создать зону хранения, Вам нужно вначале задать отдельно наборы стеллажей, входящих в эту зону, с помощью объектов NetworkStorage, т.e. указать их узлы входа, фигуры проходов, количество мест в ряду и уровней. Стеллажи не должны быть идентичными: они могут иметь различные вместимости и размеры ячеек; кроме того нет необходимости в выравнивании нарисованных стеллажей. Этиобъекты NetworkStorage нужно перечислить в параметре Объекты NetworkStorage {st0, st1, ...} объекта NetworkStorageZone.
NetworkStorageZone предоставляет тот же программный интерфейс, что и объект NetworkStorage, но отсчет рядов начинается с 0 до 2*(число объектов NetworkStorage)-1, поэтому, скажем, пятому объекту NetworkStorage в зоне хранения будут соответствовать стеллажи с номерами 8 и 9. Кроме того, есть дополнительный метод cellExists( row, position, level ) для проверки того, находится ли ячейка с заданными координатами в зоне хранения, и метод getMaxPositions(), возвращающий количество мест в самом протяженном стеллаже этой зоны хранения (он может пригодиться при прохождении в цикле всех стеллажей зоны хранения).
Действия, производимые при совершении действий с ячейками зоны хранения (такие, как Действие при помещении, Действие при извлечении и т.д.) не переопределяют аналогичные действия соответствующих стеллажей, а выполняются после них.
Стоит отметить, что NetworkStoragePut и NetworkStoragePick могут работать как с объектом, моделирующим зону хранения (NetworkStorageZone), так и с объектом, моделирующим стеллажи (NetworkStorage), поскольку оба этих объекта реализуют интерфейс StorageAccess.
int capacity() - возвращает вместимость зоны хранения (сумму вместимостей отдельных стеллажей, входящих в состав этой зоны).
boolean cellExists(int row, int position, int level) - проверяет, находится ли ячейка с заданными координатами [ряд row, место position, уровень level] в этой зоне хранения (это бывает нужно тогда, когда зона хранения содержит стеллажи разной высоты или стеллажи с различным числом ячеек в ряду).
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] (уровень не имеет значения, поскольку ячейки, располагающиеся одна над другой, имеют один и тот же узел).
int getMaxPositions() - возвращает количество мест в ряду в самом протяженном стеллаже этой зоны хранения.
T getRandom() - возвращает случайную заявку из зоны хранения или null, если зона хранения пуста.
NetworkStorage<T> getStorage(int row) - возвращает стеллаж, содержащий заданный ряд.
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() - возвращает количество заявок, находящихся в зоне хранения в текущий момент.