Вагон (RailCar)

Вагоны создаются объектом TrainSource (в составе поездов) и во время всего своего пребывания на ж/д узле полностью управляются поездами. 

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

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


2D анимация вагонов

3D анимация вагонов

Чтобы создать нестандартный тип вагона

  1. Перетащите элемент Тип вагона из палитры Железнодорожной Библиотеки в графический редактор. 

  2. Появится диалоговое окно Создание агентов
  3. На первой странице Мастера укажите Имя нового типа вагонов. Нажмите Далее.

  4. Выберите тип анимации для вагонов этого типа. Если вы хотите, чтобы агенты отображались и в 2D, и в 3D, выберите 3D и выберите 3D фигуру анимации из списка ниже, в ином случае, выберите 2D и выберите фигуру из другого списка. Если ни одна фигура не подходит вам, выберите опцию Нет. Вы можете нарисовать фигуру анимации в типе агента позже в любое время. 

  5. Закончив выбирать фигуру анимации, щелкните кнопку Далее, чтобы перейти на следующий шаг. 
  6. Укажите параметры для этого типа вагонов. Щелкните мышью кнопку < добавить... > в списке параметров, чтобы добавить новый параметр. Выделив этот параметр в списке, вы можете настроить его имя, тип и значение по умолчанию в настройках на панели справа. Чтобы удалить параметр, щелкните кнопку .

  7. Щелкните Готово.

Откроется графическая диаграмма только что созданного вами типа вагона. Вы увидите там выбранную вами фигуру анимации агента и параметры, заданные вами в Мастере создания нового типа вагона.

Вы можете использовать этот тип вагона в блоках диаграммы, например, в параметрах TrainSource:

Функции

Основные (доступные всегда, независимо от того, является вагон частью поезда Train или нет)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

RailwayTrack 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(), если такой был).

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

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

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

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

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

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

callbackAt( RailwayTrack track, PositionOnTrack pointOnTrack ) - Аналогична функции callbackAt( track, pointOnTrack, null ).
        Параметры: track - путь, для которого следует выполнить код
              pointOnTrackточка ж/д пути, заданная на указанном пути

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

Уничтожение

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

Движение

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

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

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

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

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