Перейти до змісту

Опции пути в profile.dat и генерация рельсов

Документ описывает строковые поля правого и левого пути в профиле маршрута (в Route Editor — выпадающие списки Str R и Str L), их связь с полем strelki в route*.trk, а также то, какие имена объектов рельсов (1track, 1track500l, 2track2-2, …) выставляет при пересборке процедура Build.


Где хранится и что куда попадает

  • В profile.dat (TAB) на каждый пикет (100 м) записываются, среди прочего, числовой радиус кривой и две строки опций.
  • При Rebuild редактор заполняет:
  • Tracks[1, *].strelkiRightTrackOptions (правый / «правильный» главный путь в терминах кода);
  • Tracks[2, *].strelkiLeftTrackOptions (левый / «неправильный» путь).
  • Внутри одного пикета длина шага геометрии по умолчанию 100 м; для ряда опций пикет дробится на несколько сегментов (см. 1-2, n: и т.д.) — тогда в route*.trk появляется несколько записей подряд с тем же типом перехода.

Имеет значение также IsDoubleTrack (двухпутка): при 0 рисуется один главный путь; при 1 — два основных пути с междупутным расстоянием (базовые сдвиги 3.75 м с каждой стороны оси, далее корректируются опциями).


Список значений в комбобоксах редактора

Str R (правый путь):
0, 1-2, 1+2, 2-1, 2+1, 2-2, 2+2, 1-22, 1+22, 2-22, 2+22, -2, +2, 2-, 2+, -, ++, +++, ++++, --, ---, ----, m:, n:.

Str L (левый путь):
0, -2, +2, 2-, 2+, m:, n:.

Значения m: и n: в данных дополняются числами (см. ниже); в списке есть только префикс как подсказка.


Смысл «стрелочных» и переходных кодов (1-2, 2+1, …)

Цифры 1 и 2 условно обозначают два главных пути (нитки). Знаки - / + задают сторону съезда / сближения относительно направления профиля. Дополнительная «2» в конце (1-22, 2+22) означает расширенный вариант перехода (дополнительный боковой путь / смещения для КС и рельсов).

Кратко о поведении в BuildFromProfile:

Код (Str R) Назначение (по коду редактора)
0 Обычный прямой участок; при двухпутке — два симметричных 1track.
1-2 Переход с пути 1 на путь 2 в сторону «минус»; геометрия режется на части; модель 1track1-2.
1+2 Переход «плюс»; 1track1+2.
2-1 Обратный переход; 1track2-1.
2+1 1track2+1, сдвиг начала второй нитки (TrackShift := -3.75), отдельные смещения для сегментов.
2-2 / 2+2 Два пути на одном пикете — модели 2track2-2, 2track2+2 (центр в оси пикета).
1-22 / 1+22 Расширенные переходы; одна или две модели 1track1-22 / 1track1+22 в зависимости от кода.
2-22 / 2+22 Две 1track1-22 или две 1track1+22; для боковых рельсов добавляется LeftAddShift / RightAddShift = 7.5 м.
- Рельс с зеркалом/вариантом 1track- (на двухпутке — на обеих нитках).
++, +++, ++++ Пошаговое расширение междупутья: увеличиваются GlobalTrackShiftR/L, рельсы сдвигаются и получают поворот ±0.57° / 1.14° / 2.28° (в градусах в PlaceObject).
--, ---, ---- Сужение; те же углы с обратным знаком.
+2, -2, 2+, 2- Фрагменты бокового пути у правой нитки: имена 1track1+2, 1track1-2, 1track2+1, 1track2-1 (составляются конкатенацией строк в коде). При двухпутке и Left = 0 добавляется вторая 1track.
Str L: +2, -2, 2+, 2- Аналогично для левой стороны; на однопутке объект ставится на позицию «правого» смещения с составным именем.

Эти же коды участвуют в расстановке контактной сети (PlaceKSAt): для разных значений подбираются углы проводов (±4.3° и др.) и типы опор/проводов.


Ручное смещение пути: m:

Формат в данных: префикс m:, далее одно или два вещественных поля, разделённых / (разбор с позиции символа после m:):

  • Первое число — дополнительное поперечное смещение для конца звена (Str R к GlobalTrackShiftR, Str L — с минусом к GlobalTrackShiftL).
  • Второе число (если есть второй сегмент после /) — приращение высоты Z конца этого же звена.

Примеры из контента: m:80, m:36.5, m:71.9 (только поперечка; вторая компонента тогда не задаётся). Длинный вид: m:смещение_по_X/дельта_Z.

  • В конце пикета к смещению добавляется то же значение для стыковки с следующим звеном.
  • Пикеты (PlacePikets) при наличии m: или n: в Str R не генерируются (чтобы не ломать ручную геометрию).
  • Стык с предыдущим пикетом: если на предыдущем пикете был m: или n:, координаты начала текущего звена копируются с конца предыдущего (нет разрыва).
  • Ограничение в RefreshProfileOpposingMainTrackForPicket: при нулевом радиусе для двухпутки можно пересобрать «главные» 1track; если радиус ≠ 0 и есть m:, обновление противоположной нитки пропускается (кривая + ручное уширение в этом пути не поддерживаются вместе).

Дополнительно для обрывов (SteepL / SteepR) при m: в строке опций в сдвиг рельефа прибавляется целое из GetStrToSep(..., ';', 3) — то есть в строке может быть задуман формат с ;, если используется эта ветка (реже; проверяйте на своём профиле).


Пошаговое смещение вдоль пикета: n:

Формат: n: затем одно или несколько вещественных значений через /, например:

n:69.8/61.1/53.8/47.8 (Str R) и n:-34.7/-34.7/-34.65/-34.65 (Str L).

  • Количество сегментов на пикет берётся как максимум из числа частей справа и слева (если с обеих сторон есть n:); иначе используется базовое деление (для переходов типа 1-24 части по 25 м).
  • Каждое число — это накопленное поперечное смещение (в метрах) для данной «ступени» вдоль пикета: между шагами применяется разность с предыдущим значением, чтобы путь плавно уходил в сторону.
  • На кривой при наличии n: число частей дуги увеличивается (не меньше 5), чтобы дискретизация дуги не стала грубее, чем нужно для n:.
  • При однопутке и n: на правой стороне вторая нитка (Tracks[2]) в конце может совмещаться с первой (код копирует координаты).

Радиус кривой (числовое поле профиля) и имена рельсов 1track500l

В профиле радиус задаётся в метрах со знаком (+ — кривая в одну сторону, — в другую), как в комментариях к profile.dat.

Редактор подставляет модели кривых только для шести значений:

Radius Имя объекта в objects.dat
500 1track500l
−500 1track500r
1000 1track1000l
−1000 1track1000r
2000 1track2000l
−2000 1track2000r

Дополнительно:

  • Для последнего поставленного рельса на пикете подправляется AngleZ с учётом кривизны и междупутья.
  • Если на этом пикете Str R = -, к имени рельса дописывается суффикс - (например 1track1000l-).

Боковые пути на кривой: в PlaceOtherCurvedTracks для каждого дополнительного пути используется то же имя (1track500l и т.д.), что и для основного, если радиус из списка выше. Для других радиусов боковые индексы сбрасываются (отдельных моделей нет — только прямые 1track на прямых участках).

Внутренние мелкие сегменты при разбиении дуги в route*.trk получают strelki = IntToStr(Radius) (число как строка), а не текст из 1-2.


Глобальные сдвиги GlobalTrackShiftL / GlobalTrackShiftR

Начальное значение 3.75 м (половина стандартного междупутного 7.5 м). На пикетах с ++ / -- и т.д. сдвиги изменяются (+1, +2, +4 или −1, −2, −4), что влияет на все последующие пикеты до следующего изменения.


Порядок генерации в BuildFromProfile (упрощённо)

На каждый пикет i:

  1. Создаётся звено главного пути; при необходимости начало стыкуется с концом предыдущего (m:/n: на пред. пикете).
  2. Выставляются StartX/Y/Z, StartAngleZ, учёт uklon.
  3. Вызываются ландшафт, ограждения, при электрификации — КС (PlaceKS).
  4. При отсутствии m:/n:пикеты.
  5. Обновляются глобальные междупутные сдвиги по ++/--/…
  6. По комбинации Str L / Str R и радиуса вызывается PlaceObject с одним из имён рельса (см. таблицы выше) или ветка PlaceOtherStraightTracks / PlaceOtherCurvedTracks.
  7. Если радиус = 0, вызывается PlaceOtherStraightTracks — расстановка боковых 1track с шагом 7.5 м и учётом 1-22/2+22 и углов от ++/--.
  8. После размещения рельса при ненулевом радиусе переименовываются последние объекты в 1track500l и т.п.; для двухпутки корректируется предпоследний рельс при необходимости.
  9. Для переходов 1-22+22 и для прямых с n: выполняется дробление сегмента и движение точки Start* для следующего пикета.