Skip to content

Commit ae626ec

Browse files
committed
Show more data for consists, some aggregated from cars.
1 parent dc54f37 commit ae626ec

File tree

6 files changed

+77
-12
lines changed

6 files changed

+77
-12
lines changed

Source/Contrib/ContentManager/ContentInfo.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
using System.Runtime.Serialization.Formatters.Binary;
2828
using System.Text;
2929
using Path = ORTS.ContentManager.Models.Path;
30-
using FormatStrings = ORTS.Common.FormatStrings;
30+
using ORTS.Common;
3131

3232
namespace ORTS.ContentManager
3333
{
@@ -189,6 +189,12 @@ public static string GetText(Content content)
189189
details.AppendFormat("NumEngines:\t{1}{0}", Environment.NewLine, data.NumEngines);
190190
details.AppendFormat("NumCars:\t{1}{0}", Environment.NewLine, data.NumCars);
191191
details.AppendFormat("MaxSpeed:\t{1}{0}", Environment.NewLine, FormatStrings.FormatSpeedLimit(data.MaxSpeedMps, IsMetric));
192+
details.AppendFormat("Weight:\t{1}{0}", Environment.NewLine, FormatStrings.FormatLargeMass(data.MassKG, IsMetric, IsUk));
193+
details.AppendFormat("Length:\t{1}{0}", Environment.NewLine, FormatStrings.FormatShortDistanceDisplay(data.LengthM, IsMetric));
194+
details.AppendFormat("Power:\t{1}{0}", Environment.NewLine, FormatStrings.FormatPower(data.MaxPowerW, IsMetric, isImperialBHP, isImperialBTUpS));
195+
details.AppendFormat("MaxTE:\t{1}{0}", Environment.NewLine, FormatStrings.FormatForce(data.MaxTractiveForceN, IsMetric));
196+
if (!IsMetric && !IsUk) details.AppendFormat("HPT:\t{1}{0}", Environment.NewLine, FormatStrings.FormatHPT(data.MaxPowerW, data.MassKG));
197+
if (!IsMetric && !IsUk) details.AppendFormat("TPOB:\t{1}{0}", Environment.NewLine, FormatStrings.FormatTPOB(data.MassKG, data.NumOperativeBrakes));
192198
details.AppendLine();
193199
details.AppendFormat("Car ID:\tDirection:\tName:\t{0}", Environment.NewLine);
194200
foreach (var car in data.Cars)

Source/Contrib/ContentManager/Models/Consist.cs

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
using System;
2020
using System.Collections.Generic;
2121
using System.Diagnostics;
22+
using System.IO;
2223
using System.Linq;
24+
using System.Runtime.CompilerServices;
2325
using System.Text;
2426

2527
namespace ORTS.ContentManager.Models
@@ -31,8 +33,8 @@ public class Consist
3133
public readonly string NumCars;
3234
public readonly float MaxSpeedMps;
3335
public readonly float LengthM = 0F;
34-
public readonly float WeightKG = 0F;
35-
public readonly float PowerW = 0F;
36+
public readonly float MassKG = 0F;
37+
public readonly float MaxPowerW = 0F;
3638
public readonly float MaxTractiveForceN = 0F;
3739
public readonly float MaxBrakeForce = 0F;
3840
public readonly int NumOperativeBrakes = 0;
@@ -52,23 +54,47 @@ public Consist(Content content)
5254
var WagCount = 0;
5355
var Separator = ""; // when set, indicates that subsequent engines are in a separate block
5456

57+
var basePath = System.IO.Path.Combine(System.IO.Path.Combine(content.Parent.PathName, "Trains"), "Trainset");
58+
5559
var CarList = new List<Car>();
5660
foreach (Wagon wag in file.Train.TrainCfg.WagonList)
5761
{
5862
CarList.Add(new Car(wag));
5963

60-
if (wag.IsEngine)
61-
{
62-
EngCount++;
63-
} else
64+
try
6465
{
65-
if (EngCount > 0)
66+
var fileType = wag.IsEngine ? ".eng" : ".wag";
67+
var filePath = System.IO.Path.Combine(System.IO.Path.Combine(basePath, wag.Folder), wag.Name + fileType);
68+
var wagonFile = new WagonFile(filePath);
69+
var engFile = wag.IsEngine ? new EngineFile(filePath) : null;
70+
71+
LengthM += wagonFile.LengthM;
72+
MassKG += wagonFile.MassKG;
73+
MaxBrakeForce += wagonFile.MaxBrakeForceN;
74+
if (wagonFile.MaxBrakeForceN > 0) NumOperativeBrakes++;
75+
76+
if (wag.IsEngine && engFile.MaxForceN > 25000) // exclude legacy driving trailers / cab-cars
77+
{
78+
EngCount++;
79+
80+
MaxPowerW += engFile.MaxPowerW;
81+
MaxTractiveForceN += engFile.MaxForceN;
82+
}
83+
else if (!wag.IsEOT && wagonFile.LengthM > 1.1) // exclude legacy EOT
6684
{
67-
NumEngines = NumEngines + Separator + EngCount.ToString();
68-
EngCount = 0; Separator = "+";
85+
WagCount++;
6986
}
70-
WagCount++;
87+
} catch (IOException e) // continue without details when eng/wag file does not exist
88+
{
89+
if (wag.IsEngine) EngCount++; else WagCount++;
90+
}
91+
92+
if (!wag.IsEngine && EngCount > 0)
93+
{
94+
NumEngines = NumEngines + Separator + EngCount.ToString();
95+
EngCount = 0; Separator = "+";
7196
}
97+
7298
}
7399
if (EngCount > 0) { NumEngines = NumEngines + Separator + EngCount.ToString(); }
74100
if (NumEngines == null) { NumEngines = "0"; }

Source/ORTS.Common/Conversions.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -913,5 +913,33 @@ public static string FormatApproximateTime(double clockTimeSeconds)
913913

914914
return string.Format("{0:D2}:{1:D2}", hour, minute);
915915
}
916+
917+
918+
/// <summary>
919+
/// Calculate and format horsepower per ton for consist, rounded to one decimal.
920+
/// </summary>
921+
/// <param name="consistPowerW"></param>
922+
/// <param name="consistMassKG"></param>
923+
/// <returns>horsepower-per-ton formated to one decimal.</returns>
924+
//TODO: implement UK and metric version
925+
public static string FormatHPT(float consistPowerW, float consistMassKG)
926+
{
927+
var hpt = consistMassKG > 0 ? W.ToHp(consistPowerW) / Kg.ToTUS(consistMassKG) : 0;
928+
return string.Format("{0:0.0}", hpt);
929+
}
930+
931+
932+
/// <summary>
933+
/// Calculate and format tons per operative brake for consist, rounded to an integer.
934+
/// </summary>
935+
/// <param name="consistMassKG"></param>
936+
/// <param name="consistNumOpBrakes"></param>
937+
/// <returns>tons-per-operative-brake formated to an integer.</returns>
938+
//TODO: implement UK and metric version
939+
public static string FormatTPOB(float consistMassKG, float consistNumOpBrakes)
940+
{
941+
var tpob = consistNumOpBrakes > 0 ? Kg.ToTUS(consistMassKG) / consistNumOpBrakes : 0;
942+
return string.Format("{0:0}", tpob);
943+
}
916944
}
917945
}

Source/Orts.Formats.Msts/ActivityFile.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1320,6 +1320,7 @@ public class Wagon {
13201320
public string Folder;
13211321
public string Name;
13221322
public int UiD;
1323+
public bool IsWagon;
13231324
public bool IsEngine;
13241325
public bool IsEOT;
13251326
public bool Flip;
@@ -1331,7 +1332,7 @@ public Wagon(STFReader stf) {
13311332
new STFReader.TokenProcessor("uid", ()=>{ UiD = stf.ReadIntBlock(null); }),
13321333
new STFReader.TokenProcessor("flip", ()=>{ stf.MustMatch("("); stf.MustMatch(")"); Flip = true; }),
13331334
new STFReader.TokenProcessor("enginedata", ()=>{ stf.MustMatch("("); Name = stf.ReadString(); Folder = stf.ReadString(); stf.MustMatch(")"); IsEngine = true; }),
1334-
new STFReader.TokenProcessor("wagondata", ()=>{ stf.MustMatch("("); Name = stf.ReadString(); Folder = stf.ReadString(); stf.MustMatch(")"); }),
1335+
new STFReader.TokenProcessor("wagondata", ()=>{ stf.MustMatch("("); Name = stf.ReadString(); Folder = stf.ReadString(); stf.MustMatch(")"); IsWagon = true; }),
13351336
new STFReader.TokenProcessor("eotdata", ()=>{ stf.MustMatch("("); Name = stf.ReadString(); Folder = stf.ReadString(); stf.MustMatch(")"); IsEOT = true; }),
13361337
new STFReader.TokenProcessor("loaddata", ()=>
13371338
{

Source/Orts.Formats.Msts/EngineFile.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ namespace Orts.Formats.Msts
2828
public class EngineFile
2929
{
3030
public string Name;
31+
public string EngineType;
3132
public float MaxPowerW;
3233
public float MaxForceN;
3334
public float MaxSpeedMps;
@@ -43,6 +44,7 @@ public EngineFile(string filePath)
4344
stf.ReadString();
4445
stf.ParseBlock(new STFReader.TokenProcessor[] {
4546
new STFReader.TokenProcessor("name", ()=>{ Name = stf.ReadStringBlock(null); }),
47+
new STFReader.TokenProcessor("type", ()=>{ EngineType = stf.ReadStringBlock(null); }),
4648
new STFReader.TokenProcessor("maxpower", ()=>{ MaxPowerW = stf.ReadFloatBlock( STFReader.UNITS.Power, null); }),
4749
new STFReader.TokenProcessor("maxforce", ()=>{ MaxForceN = stf.ReadFloatBlock( STFReader.UNITS.Force, null); }),
4850
new STFReader.TokenProcessor("maxvelocity", ()=>{ MaxSpeedMps = stf.ReadFloatBlock( STFReader.UNITS.Speed, null); }),

Source/Orts.Formats.Msts/WagonFile.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public override string ToString()
4949
}
5050

5151
public string Name;
52+
public string WagonType;
5253
public float MassKG;
5354
public float LengthM;
5455
public float MaxBrakeForceN;
@@ -62,6 +63,7 @@ public WagonFile(string filePath)
6263
stf.ReadString();
6364
stf.ParseBlock(new STFReader.TokenProcessor[] {
6465
new STFReader.TokenProcessor("name", ()=>{ Name = stf.ReadStringBlock(null); }),
66+
new STFReader.TokenProcessor("type", ()=>{ WagonType = stf.ReadStringBlock(null); }),
6567
new STFReader.TokenProcessor("mass", ()=>{ MassKG = stf.ReadFloatBlock(STFReader.UNITS.Mass, null); }),
6668
new STFReader.TokenProcessor("size", ()=>{ LengthM = new CarSize( stf).CarLength; }),
6769
new STFReader.TokenProcessor("maxbrakeforce", ()=>{ MaxBrakeForceN = stf.ReadFloatBlock(STFReader.UNITS.Force, null); }),

0 commit comments

Comments
 (0)