Вагон (RailCar)

Класс RailCar является фундаментальным классом, представляющим все виды железнодорожных вагонов и локомотивов. 

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

Начиная с версии AnyLogic 6.5.1 вагоны создаются объектом TrainSource (в составе поездов) и во время всего своего пребывания на ж/д узле полностью управляются поездами. Но при этом поддерживается и использовавшийся ранее низкоуровневый интерфейс для создания вагонов, управления их движением, сцеплением/отцеплением, в основном для совместимости библиотеки с ранее разработанными моделями.

У вагона есть размерности (длина и ширина) и два торца (передний и задний).  Длина вагона может быть задана только в момент создания вагона (например, в параметре Длина вагона или в коде параметра Инициализация вагона объекта TrainSource) и не может быть изменена впоследствии. 

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


Объяснение терминологии на примере заданной по умолчанию 2D анимации вагона

Анимация вагона

Вагоны могут отображаться как на 2D, так и на 3D анимации. 

Заданная по умолчанию 2D фигура анимации вагона представляет собой скругленный прямоугольник заданного цвета (см. рисунок выше); его передняя сторона помечается черной точкой. Если вагон сцеплен, то рисуется и сцепка с другим вагоном. Вы можете выделить вагон на анимации, в этом случае вокруг него будет нарисован круг.

Заданная по умолчанию фигура 3D анимации - параллелепипед. Вы можете изменить цвет этой фигуры с помощью метода setColor(). Вы также можете задать любую другую трехмерную фигуру в качестве фигуры анимации вагона. Готовые к использованию 3D изображения локомотивов и вагонов различных типов Вы можете найти в палитре 3D Объекты.

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

Заданная по умолчанию (слева) и определенная пользователем 3D анимация вагонов

Функции

Основные

Конструкторы и инициализация

RailCar() - Создает новый вагон длиной 10 метров, шириной 4 метра, со скоростью 10 м/с и случайно выбранным цветом.

RailCar( double length ) - Создает новый вагон заданной длины, шириной 4 метра, со скоростью 10 м/с и случайно выбранным цветом.
        Параметр: length - длина вагона, в метрах.

RailCar( double length, double width ) - Создает новый вагон заданной длины и ширины, со скоростью 10 м/с и случайно выбранным цветом.
        Параметры: length - длина вагона, в метрах
                            width - ширина вагона, в метрах

Внешний вид вагона

void setLength(double length) - Задает длину вагона. Может выполняться только до добавления вагона на жезнодорожный узел.
        Параметр: length - длина вагона, в метрах

double getLength() - Возвращает длину вагона, в метрах.

void setWidth( double width ) - Задает ширину вагона.
        Параметр: width - новая ширина вагона, в метрах

double getWidth() - Возвращает ширину вагона, в метрах.

void setColor( Color color ) - Задает цвет вагона. Хотя цвет всегда хранится в объекте RailCar, он применяется только к заданной по умолчанию анимации.
        Параметр: color - новый цвет

Color getColor() - Возвращает цвет вагона.

void setShape( Shape shape ) - Задает 2D или 3D фигуру, которая будет использоваться для анимации этого вагона.

Shape getShape() -  Возвращает фигуру, используемую для анимации этого вагона, или null.

void highlight( boolean yes ) - Выделяет вагон на анимации, либо снимает выделение (в зависимости от значения аргумента).
        Параметр: yes - если true, то вагон следует выделить, если false - то снять выделение

boolean isHighlighted() - Возвращает true, если вагон выделен на анимации, и false - если нет.

Информация о вагоне

RailCar getCoupledCar( boolean infront ) - Возвращает вагон, сцепленный с этим вагоном с заданного параметром infront торца. Если с заданной стороны вагон не сцеплен, то возвращает null.
        Параметр: infront - если true, то передний торец, иначе - задний

boolean getDirection() - Возвращает направление движения вагона в данный момент (или его последнего движения). Возвращает true, если направление прямое (передняя сторона движется впереди задней), false - если обратное.

Train getTrain() - Возвращает поезд, которому принадлежит вагон. Если вагон не принадлежит никакому поезду, то функция возвращает  null.

boolean isFirst() -  Проверяет, является ли данный вагон первым вагоном в последовательности сцепленных вагонов (которые могут и не образовывать объект Train), т.e. не движутся ли перед ним прицепленные вагоны. Если вагон не движется, то результат неопределен. Возвращает true, если это первый вагон состава (или отдельный вагон), false - в противном случае.

boolean isLast() - Проверяет, является ли данный вагон последним вагоном в последовательности сцепленных вагонов (которые могут и не образовывать объект Train), т.e. не движутся ли за ним прицепленные вагоны. Если вагон не движется, то результат неопределен. Возвращает true, если это последний вагон состава (или отдельный вагон), false - в противном случае.

double getVelocity() - Возвращает скорость вагона (в метрах в секунду). Положительное значение скорости не обязательно означает, что вагон движется – если вагон стоит, то это значение скорости, с которой вагон поедет, когда его запустят.

Track getTrack( boolean infront ) - Возвращает путь, на котором находится заданный параметром infront торец вагона.
        Параметр: infront - если true, то передний торец, иначе - задний

double getOffset( boolean infront ) - Возвращает смещение заданного параметром infront торца вагона относительно начала пути (в метрах). Значение 0 соответствует началу пути.
        Параметр: infront - если true, то передний торец, иначе - задний

boolean getOrientation( boolean infront ) - Проверяет, соответствует ли направление вагона направлению пути, на котором находится заданный параметром infront торец вагона. Возвращает  true, eсли направление “от конца к началу вагона” соответствует направлению “от начала к концу пути”. 
        Параметр: infront - если true, то передний торец, иначе - задний

boolean isForwardOnTrack( boolean infront ) - Возвращает направление движения вагона относительно пути, на котором находится заданный параметром infront торец вагона. Возвращает true, если направление движения вагона соответствует направлению пути.
        Параметр: infront - если true, то передний торец, иначе - задний

boolean isMoving() - Возвращает true, если в текущий момент вагон движется, и false - если нет.

double getX( boolean infront ) - Возвращает x-координату заданного торца вагона относительно группы фигур железнодорожного узла, в пикселах.
        Параметр: infront - если true, то возвращает координату переднего торца, если false - то заднего

double getY( boolean infront ) - Возвращает y-координату заданного торца вагона относительно группы фигур железнодорожного узла, в пикселах.
        Параметр: infront - если true, то возвращает координату переднего торца, если false - то заднего

double getDistanceDriven() -  Возвращает расстояние (в метрах), которое проехал вагон с момента своего создания (или последнего вызова метода resetDistanceDriven(), если такой был).

void resetDistanceDriven() - Устанавливает расстояние, пройденное вагоном, равным нулю.

RailYard getRailYard() - Возвращает железнодорожный узел, на котором в текущий момент находится вагон.

Выполнение действий в результате обратных вызовов

void callbackAt( Track track, double offset, Object info ) - Задает для вагона особую точку, при достижении которой (а именно, когда этой точки достигнет движущийся первым торец вагона) будет послан запрос на выполнение кода, заданный в параметре Действие при достижении особой точки объекта RailYard. Точка задается путем указания пути track и точки смещения от его начала offset. Прямо перед выполнением кода запрос удаляется (хотя в этом коде пользователь может послать еще один запрос). Каждый новый запрос удаляет сделанный ранее. Вы можете передать в код любую информацию (Object) для идентификации типа произошедшего события.  
        Параметры: track - путь, для которого следует выполнить код
             offset - смещение (в метрах) от начала пути, при достижении которого будет выполнен код
             info - произвольный объект с информацией, который будет передан в контекст выполняемого кода

void callbackAt( Track track, double offset ) - Аналогична функции callbackAt( track, null, offset ).
        Параметры: track - путь, для которого следует выполнить код
             offset - смещение (в метрах) от начала пути, при достижении которого будет выполнен код

void callbackAt( Track track, ShapeLine line, Object info ) - Аналогична функции callbackAt( track, offset, info ), с той разницей, что смещение задается пересечением пути и заданной линии.
        Параметры: track - путь, для которого следует выполнить код
              line - линия, которая должна пересекать путь в какой-то точке
              info - произвольный объект с информацией, который будет передан в контекст выполняемого кода

void callbackAt( Track track, ShapeLine line ) - Аналогична функции callbackAt( track, line, null ).
        Параметры: track - путь, для которого следует выполнить код
              line - линия, которая должна пересекать путь в какой-то точке

Низкоуровневые (функции недоступны, если вагон является частью поезда Train)

Уничтожение

void dispose()- Полностью уничтожает вагон, то есть удаляет его из железнодорожного узла вне зависимости от того, где он находился. Вагон должен не двигаться и не принадлежать поезду Train. Этот метод также вызывается объектом TrainDispose.

Движение

void stop() - Останавливает вагон. Если на момент вызова функции он не двигался, то функция не делает ничего. Вагон должен не принадлежать поезду Train.

void go( boolean forward ) - Начинает движение вагона (или изменяет его направление). Значение скорости должно быть положительным.
        Параметр: forward - если true, то вагон будет двигаться вперед (впереди будет двигаться передний торец вагона), иначе - в обратном направлении

void couple( boolean infront ) - Сцепляет вагон с другим вагоном, находящимся рядом с его торцом, заданным аргументом infront. Вагон должен не принадлежать поезду Train.
        Параметр: если true, то сцеплять с передним торцом вагона, иначе - с задним

void decouple( boolean infront ) - Отцепляет вагон от другого вагона, находящегося рядом с его торцом, заданным аргументом infront. Если с заданной стороны вагона он не соединен ни с одним другим вагоном, то будет выдано сообщение об ошибке. Вагон должен не принадлежать поезду Train.
        Параметр: если true, то отцеплять от переднего торца вагона, иначе - от заднего

void setVelocity( double v ) - Задает новую скорость для вагона. Применяется мгновенно, даже если на момент вызова функции вагон двигался. Если скорость задается равной нулю, то вагон останавливается. Вагон должен не принадлежать поезду Train.
        Параметр: v - новая скорость