ResourceUnit является базовым классом для всех ресурсов Основной библиотеки, как "обычных", заданных с помощью объекта ResourcePool, так и сетевых, заданных с помощью NetworkResourcePool.
ResourceUnit по сути является обычным Java классом с той функциональностью, которая необходима и достаточна для обработки и отображения анимации ресурса объектами Основной библиотеки. Вы можете расширить эту функциональность добавлением дополнительных полей и методов и работой с ними из объектов диаграммы, описывающей Ваш процесс.
Ресурс каждого типа задается одним объектом: ResourcePool либо NetworkResourcePool. Получить этот объект можно с помощью следующего метода ресурса:
Метод возвращает объект типа ActiveObject, поскольку он является базовым классом для классов ResourcePool и NetworkResourcePool. Вы можете проверить, какой именно объект задает этот тип ресурса с помощью оператора instanceof, если же класс этого объекта Вам известен, то Вы можете сразу написать, например, (ResourcePool)unit.getResourcePool().
boolean isBusy() - проверяет, свободен или занят ресурс
double getUtilization() - возвращает статистику использования ресурса с момента его создания до текущего момента времени (значение лежит в интервале [0..1], освобожденные сетевые ресурсы, возвращающиеся в свое базовое местоположение, считаются занятыми)
Если ресурс задан объектом заявка NetworkResourcePool, то он хранит определенную информацию, связанную с его пребыванием в сети. Пользователю предоставляется следующий программный интерфейс, большей частью предоставляемый также и классом Entity (посредством общего базового класса AnimatableItem):
setNetwork( Network network, ShapeRectangle location ) - [предназначен только для внутреннего использования] добавляет ресурс в заданную сеть и помещает его в указанное место сети.
Network getNetwork() - возвращает сеть, в которой находится ресурс (если таковой нет, то возвращает null)
setNetworkLocation( ShapeRectangle location ) - [предназначен только для внутреннего использования] помещает ресурс в указанное место сети
ShapeRectangle getNetworkLocation() - возвращает текущее местоположение (узел) ресурса в сети или же последний узел, в котором он находился, если в данный момент времени ресурс движется
setNetworkSpeed( double speed ) - задает скорость движения ресурса по сети
getNetworkSpeed() - возвращает скорость движения ресурса по сети
setNetworkShown( boolean shown ) - [предназначен только для внутреннего использования] отображает или же прячет ресурс в сети
boolean isNetworkShown() - проверяет, отображается ли ресурс сетью в данный момент времени
setNetworkHomeLocation( ShapeRectangle home ) - [предназначен только для внутреннего использования] задает базовое местоположение сетевого ресурса.
ShapeRectangle getNetworkHomeLocation() - возвращает базовое местоположение сетевого ресурса.
setNetworkAttached( boolean yes ) - [предназначен только для внутреннего использования] присоединяет/отсоединяет сетевой ресурс к заявке/от заявки, владеющей этим ресурсом.
boolean isNetworkAttached() - проверяет, присоединен ли сетевой ресурс к заявке.
setNetworkHomePosition( double x, double y ) - задает координаты базового расположения ресурса относительно узла его базового местоположения.
double getNetworkHomeX() - возвращает x координату базового местоположения сетевого ресурса.
double getNetworkHomeY() - возвращает y координату базового местоположения сетевого ресурса.
Основная библиотека предоставляет пользователям широкий спектр возможностей по управлению визуальным представлением ресурсов на презентации (эта функциональность предоставляется также и классом Entity (посредством общего базового класса AnimatableItem)).
По умолчанию ресурс отображается на анимации небольшим кружком случайно выбранного цвета. Если Вас устраивает такой внешний вид, но Вы хотите изменить цвет на какой-то определенный, используйте следующие методы:
Color getColor() - возвращает цвет принятой по умолчанию анимации
Если Вы хотите присвоить ресурсу какую-то другую фигуру анимации (или группу фигур), Вы должны сделать следующее. Если фигура должна быть присвоена ресурсу во время его создания, Вы должны указать фигуру в поле параметра Фигура анимации ресурса объекта ResourcePool или NetworkResourcePool. Если затем Вы захотите изменить фигуру во время выполнения модели (отразив, тем самым, например, изменение состояния ресурса), Вы можете воспользоваться следующими методами:
setShape(Shape shape) - задает фигуру анимации ресурса
getShape() - возвращает фигуру анимации ресурса
Пожалуйста, обратите внимание, что если Вы присвоите одну и ту же фигуру сразу нескольким ресурсам, все они будут отображаться на презентации одинаково, т.е. при попытке изменить анимацию одного ресурса Вы измените анимации всех этих ресурсов. Если Вы хотите иметь уникальную фигуру анимации у каждого ресурса, чтобы иметь возможность индивидуально настраивать свойства каждой анимации, используйте опцию Уникальная фигура для каждого ресурса соответствующего объекта ResourcePool или NetworkResourcePool или самостоятельно присвойте уникальную фигуру каждому ресурсу.
Когда ресурс отображается на анимации, он отображается относительно фигуры анимации того объекта, в котором ресурс находится в текущий момент времени. Если у этого объекта выбран Тип анимации Путь (или если ресурс движется по сети), то фигура анимации ресурса будет направлена согласно направлению его движения, т.е. она будет поворачиваться при изменении этого направления. Иногда это нежелательно, поэтому мы предоставляем возможность запрещения вращения ресурас:
enableRotation( boolean yes ) - разрешает или запрещает вращение анимации ресурса
isRotationEnabled() - проверяет, разрешено ли вращение ресурса.
Кроме того, Вы можете сместить положение и угол поворота анимации ресурса относительно места и угла поворота, заданных фигурой анимации соответствующего объекта:
void setOffsets( double dx, double dy, double da ) - задает смещение места и угла поворота анимации ресурса относительно места и угла поворота, заданных фигурой анимации соответствующего объекта.
void resetOffsets() - "сбрасывает" значения всех смещений анимации (x,y и угол поворота) в 0.
Вы также можете узнать текущие значения смещений:
getOffsetX() - возвращает смещение анимации ресурса по оси x относительно места, определенного заданной фигурой анимации соответствующего объекта.
getOffsetY() - возвращает смещение анимации ресурса по оси y относительно места, определенного заданной фигурой анимации соответствующего объекта.
double getOffsetAngle() - возвращает угол дополнительного поворота анимации ресурса относительно поворота, определенного заданной фигурой анимации соответствующего объекта.
Возможность сдвигать анимацию позволяет Вам, например, помещать анимацию заявки рядом с анимацией ресурса, захваченного этой заявкой. Имеет смысл использовать Тип анимации объекта Одиночная, чтобы Вы были уверены, что координаты анимации одинкаовы для всех ресурса.
Кроме того, Вы можете переопределить метод draw(), реализующий весь процесс отрисовки анимации ресурса:
void draw( Panel panel, Graphics2D g, AffineTransform xform, double x, double y, double angle, boolean publicOnly ) - отрисовывает ресурс в заданном контексте.
В любой момент времени Вы можете получить координаты и угол поворота анимации ресурса с помощью следующих методов:
double getX() - возвращает x координату анимации ресурса (с учетом смещения, если оно есть), если же ресурс не отображается на анимации, то возвращает 0.
double getY() - возвращает y координату анимации ресурса (с учетом смещения, если оно есть), если же ресурс не отображается на анимации, то возвращает 0.
double getAngle() - возвращает угол поворота анимации заявки (с учетом смещения, если оно есть), если же заявка не отображается на анимации, то возвращает 0.
Position getPosition( Position pos )- получает координаты и угол поворота анимации ресурса (с учетом смещений, если они есть) и помещает их в существующий объект Position, переданный в качестве аргумента метода, или, если его значение равно null, создает новый объект и возвращает его. Если ресурс не отображается на анимации, возвращает null. Этот метод более эффективен, чем методы getX() и т.д., поскольку он позволяет повторно использовать объект Position и избегать создания еще одного объекта (что случается при каждом вызове getX() и т.д.). Класс Position представляет собой простую структуру данных с тремя полями типа double: x, y, и angle.
Эти методы применимы как к "обычным" анимациям (предоставляемыми объектами ResourcePool и т.д.), так и к анимациям моделей транспортных сетей. Возвращаемые методами координаты являются относительными (в случае "обычной" анимации они считаются относительно группы, к которой принадлежит фигура анимации объекта, а в случае анимации транспортных сетей - относительно группы фигур сети).
Чтобы создать нестандартный класс ресурса
Чтобы создавать ресурсы нестандартного типа, Вам нужно поместить вызов конструктора этого типа в поле Новый ресурс соответствующего объекта, например, ResourcePool. Однако хоть ресурсы в модели теперь и будут типа Operator, объекты потоковой диаграммы будут продолжать считать их ресурсами типа ResourceUnit, и не позволят явно обращаться к дополнительной функциональности класса Operator. Чтобы разрешить доступ к полям нестандартного класса ресурса в коде динамических параметров объектов ResourcePool или NetworkResourcePool, Вам нужно указать имя нестандартного класса ресурса в качестве Класса ресурса этого объекта. Если, например, Вы хотите напрямую обращаться к полю skillLevel в Действии при захвате объекта ResourcePool, Вам нужно написать Operator в поле Класс ресурса этого объекта.