Опции пути в profile.dat и генерация рельсов
Документ описывает строковые поля правого и левого пути в профиле маршрута (в Route Editor — выпадающие списки Str R и Str L), их связь с полем strelki в route*.trk, а также то, какие имена объектов рельсов (1track, 1track500l, 2track2-2, …) выставляет при пересборке процедура Build.
Где хранится и что куда попадает
- В
profile.dat(TAB) на каждый пикет (100 м) записываются, среди прочего, числовой радиус кривой и две строки опций. - При Rebuild редактор заполняет:
Tracks[1, *].strelki←RightTrackOptions(правый / «правильный» главный путь в терминах кода);Tracks[2, *].strelki←LeftTrackOptions(левый / «неправильный» путь).- Внутри одного пикета длина шага геометрии по умолчанию 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-2— 4 части по 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:
- Создаётся звено главного пути; при необходимости начало стыкуется с концом предыдущего (
m:/n:на пред. пикете). - Выставляются StartX/Y/Z, StartAngleZ, учёт uklon.
- Вызываются ландшафт, ограждения, при электрификации — КС (
PlaceKS). - При отсутствии
m:/n:— пикеты. - Обновляются глобальные междупутные сдвиги по
++/--/… - По комбинации Str L / Str R и радиуса вызывается
PlaceObjectс одним из имён рельса (см. таблицы выше) или веткаPlaceOtherStraightTracks/PlaceOtherCurvedTracks. - Если радиус = 0, вызывается
PlaceOtherStraightTracks— расстановка боковых1trackс шагом 7.5 м и учётом1-22/2+22и углов от++/--. - После размещения рельса при ненулевом радиусе переименовываются последние объекты в
1track500lи т.п.; для двухпутки корректируется предпоследний рельс при необходимости. - Для переходов
1-2…2+22и для прямых сn:выполняется дробление сегмента и движение точки Start* для следующего пикета.