@@ -419,6 +419,18 @@ public virtual void LoadFromWagFile(string wagFilePath)
419
419
RearCouplerShapeFileName = null ;
420
420
}
421
421
422
+ if ( FrontAirHoseShapeFileName != null && ! File . Exists ( wagonFolderSlash + FrontAirHoseShapeFileName ) )
423
+ {
424
+ Trace . TraceWarning ( "{0} references non-existent shape {1}" , WagFilePath , wagonFolderSlash + FrontAirHoseShapeFileName ) ;
425
+ FrontAirHoseShapeFileName = null ;
426
+ }
427
+
428
+ if ( RearAirHoseShapeFileName != null && ! File . Exists ( wagonFolderSlash + RearAirHoseShapeFileName ) )
429
+ {
430
+ Trace . TraceWarning ( "{0} references non-existent shape {1}" , WagFilePath , wagonFolderSlash + RearAirHoseShapeFileName ) ;
431
+ RearAirHoseShapeFileName = null ;
432
+ }
433
+
422
434
// If trailing loco resistance constant has not been defined in WAG/ENG file then assign default value based upon orig Davis values
423
435
if ( TrailLocoResistanceFactor == 0 )
424
436
{
@@ -436,6 +448,40 @@ public virtual void LoadFromWagFile(string wagFilePath)
436
448
}
437
449
}
438
450
451
+ // Initialise car body lengths. Assume overhang is 2.0m each end, and bogie centres are the car length minus this value
452
+
453
+ if ( CarCouplerFaceLengthM == 0 )
454
+ {
455
+ CarCouplerFaceLengthM = CarLengthM ;
456
+ }
457
+
458
+ if ( CarBodyLengthM == 0 )
459
+ {
460
+ CarBodyLengthM = CarCouplerFaceLengthM - 0.8f ;
461
+ }
462
+
463
+ if ( CarBogieCentreLengthM == 0 )
464
+ {
465
+ CarBogieCentreLengthM = ( CarCouplerFaceLengthM - 4.3f ) ;
466
+ }
467
+
468
+ if ( CarAirHoseLengthM == 0 )
469
+ {
470
+ CarAirHoseLengthM = Me . FromIn ( 26.25f ) ; // 26.25 inches
471
+ }
472
+
473
+ var couplerlength = ( ( CarCouplerFaceLengthM - CarBodyLengthM ) / 2 ) + 0.1f ; // coupler length at rest, allow 0.1m also for slack
474
+
475
+ if ( CarAirHoseLengthM < couplerlength )
476
+ {
477
+ CarCouplerFaceLengthM = CarBodyLengthM + ( 0.4f * 2.0f ) ; // Assume a coupler length of 400mm at each end and add to car body length
478
+
479
+ if ( Simulator . Settings . VerboseConfigurationMessages )
480
+ {
481
+ Trace . TraceInformation ( "Coupler length exceeded brake air hose length, so ORTSLengthCouplerFace decreased to {0}" , CarCouplerFaceLengthM ) ;
482
+ }
483
+ }
484
+
439
485
// Ensure Drive Axles is set to a default if no OR value added to WAG file
440
486
if ( WagonNumAxles == 0 )
441
487
{
@@ -964,6 +1010,10 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
964
1010
CarLengthM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
965
1011
stf . SkipRestOfBlock ( ) ;
966
1012
break ;
1013
+ case "wagon(ortslengthbogiecentre" : CarBogieCentreLengthM = stf . ReadFloatBlock ( STFReader . UNITS . Distance , null ) ; break ;
1014
+ case "wagon(ortslengthcarbody" : CarBodyLengthM = stf . ReadFloatBlock ( STFReader . UNITS . Distance , null ) ; break ;
1015
+ case "wagon(ortslengthairhose" : CarAirHoseLengthM = stf . ReadFloatBlock ( STFReader . UNITS . Distance , null ) ; break ;
1016
+ case "wagon(ortslengthcouplerface" : CarCouplerFaceLengthM = stf . ReadFloatBlock ( STFReader . UNITS . Distance , null ) ; break ;
967
1017
case "wagon(ortstrackgauge" :
968
1018
stf . MustMatch ( "(" ) ;
969
1019
TrackGaugeM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
@@ -1121,6 +1171,15 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
1121
1171
stf . SkipRestOfBlock ( ) ;
1122
1172
break ;
1123
1173
1174
+ case "wagon(coupling(frontairhoseanim" :
1175
+ stf . MustMatch ( "(" ) ;
1176
+ FrontAirHoseShapeFileName = stf . ReadString ( ) ;
1177
+ FrontAirHoseAnimWidthM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
1178
+ FrontAirHoseAnimHeightM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
1179
+ FrontAirHoseAnimLengthM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
1180
+ stf . SkipRestOfBlock ( ) ;
1181
+ break ;
1182
+
1124
1183
case "wagon(coupling(rearcoupleranim" :
1125
1184
stf . MustMatch ( "(" ) ;
1126
1185
RearCouplerShapeFileName = stf . ReadString ( ) ;
@@ -1130,7 +1189,16 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
1130
1189
stf . SkipRestOfBlock ( ) ;
1131
1190
break ;
1132
1191
1133
- case "wagon(coupling(spring(ortstensionstiffness" :
1192
+ case "wagon(coupling(rearairhoseanim" :
1193
+ stf . MustMatch ( "(" ) ;
1194
+ RearAirHoseShapeFileName = stf . ReadString ( ) ;
1195
+ RearAirHoseAnimWidthM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
1196
+ RearAirHoseAnimHeightM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
1197
+ RearAirHoseAnimLengthM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
1198
+ stf . SkipRestOfBlock ( ) ;
1199
+ break ;
1200
+
1201
+ case "wagon(coupling(spring(ortstensionstiffness" :
1134
1202
stf . MustMatch ( "(" ) ;
1135
1203
Couplers [ CouplerCountLocation ] . SetTensionStiffness ( stf . ReadFloat ( STFReader . UNITS . Force , null ) , stf . ReadFloat ( STFReader . UNITS . Force , null ) ) ;
1136
1204
stf . SkipRestOfBlock ( ) ;
@@ -1156,6 +1224,25 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
1156
1224
stf . SkipRestOfBlock ( ) ;
1157
1225
break ;
1158
1226
1227
+ case "wagon(coupling(frontairhosediconnectedanim" :
1228
+ stf . MustMatch ( "(" ) ;
1229
+ FrontAirHoseDisconnectedShapeFileName = stf . ReadString ( ) ;
1230
+ FrontAirHoseDisconnectedAnimWidthM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
1231
+ FrontAirHoseDisconnectedAnimHeightM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
1232
+ FrontAirHoseDisconnectedAnimLengthM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
1233
+ stf . SkipRestOfBlock ( ) ;
1234
+ break ;
1235
+
1236
+ case "wagon(coupling(rearairhosediconnectedanim" :
1237
+ stf . MustMatch ( "(" ) ;
1238
+ RearAirHoseDisconnectedShapeFileName = stf . ReadString ( ) ;
1239
+ RearAirHoseDisconnectedAnimWidthM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
1240
+ RearAirHoseDisconnectedAnimHeightM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
1241
+ RearAirHoseDisconnectedAnimLengthM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
1242
+ stf . SkipRestOfBlock ( ) ;
1243
+ break ;
1244
+
1245
+
1159
1246
case "wagon(coupling(spring(ortscompressionstiffness" :
1160
1247
stf . MustMatch ( "(" ) ;
1161
1248
Couplers [ CouplerCountLocation ] . SetCompressionStiffness ( stf . ReadFloat ( STFReader . UNITS . Force , null ) , stf . ReadFloat ( STFReader . UNITS . Force , null ) ) ;
@@ -1247,7 +1334,7 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
1247
1334
case "wagon(orts3dcab" : Parse3DCab ( stf ) ; break ;
1248
1335
case "wagon(numwheels" : MSTSWagonNumWheels = stf . ReadFloatBlock ( STFReader . UNITS . None , 4.0f ) ; break ;
1249
1336
case "wagon(ortsnumberaxles" : WagonNumAxles = stf . ReadIntBlock ( null ) ; break ;
1250
-
1337
+ case "wagon(ortsnumberbogies" : WagonNumBogies = stf . ReadIntBlock ( null ) ; break ;
1251
1338
case "wagon(ortspantographs" :
1252
1339
Pantographs . Parse ( lowercasetoken , stf ) ;
1253
1340
break ;
@@ -1322,6 +1409,27 @@ public virtual void Copy(MSTSWagon copy)
1322
1409
RearCouplerOpenAnimHeightM = copy . RearCouplerOpenAnimHeightM ;
1323
1410
RearCouplerOpenAnimLengthM = copy . RearCouplerOpenAnimLengthM ;
1324
1411
RearCouplerOpenFitted = copy . RearCouplerOpenFitted ;
1412
+
1413
+ FrontAirHoseShapeFileName = copy . FrontAirHoseShapeFileName ;
1414
+ FrontAirHoseAnimWidthM = copy . FrontAirHoseAnimWidthM ;
1415
+ FrontAirHoseAnimHeightM = copy . FrontAirHoseAnimHeightM ;
1416
+ FrontAirHoseAnimLengthM = copy . FrontAirHoseAnimLengthM ;
1417
+
1418
+ FrontAirHoseDisconnectedShapeFileName = copy . FrontAirHoseDisconnectedShapeFileName ;
1419
+ FrontAirHoseDisconnectedAnimWidthM = copy . FrontAirHoseDisconnectedAnimWidthM ;
1420
+ FrontAirHoseDisconnectedAnimHeightM = copy . FrontAirHoseDisconnectedAnimHeightM ;
1421
+ FrontAirHoseDisconnectedAnimLengthM = copy . FrontAirHoseDisconnectedAnimLengthM ;
1422
+
1423
+ RearAirHoseShapeFileName = copy . RearAirHoseShapeFileName ;
1424
+ RearAirHoseAnimWidthM = copy . RearAirHoseAnimWidthM ;
1425
+ RearAirHoseAnimHeightM = copy . RearAirHoseAnimHeightM ;
1426
+ RearAirHoseAnimLengthM = copy . RearAirHoseAnimLengthM ;
1427
+
1428
+ RearAirHoseDisconnectedShapeFileName = copy . RearAirHoseDisconnectedShapeFileName ;
1429
+ RearAirHoseDisconnectedAnimWidthM = copy . RearAirHoseDisconnectedAnimWidthM ;
1430
+ RearAirHoseDisconnectedAnimHeightM = copy . RearAirHoseDisconnectedAnimHeightM ;
1431
+ RearAirHoseDisconnectedAnimLengthM = copy . RearAirHoseDisconnectedAnimLengthM ;
1432
+
1325
1433
CarWidthM = copy . CarWidthM ;
1326
1434
CarHeightM = copy . CarHeightM ;
1327
1435
CarLengthM = copy . CarLengthM ;
@@ -1330,10 +1438,15 @@ public virtual void Copy(MSTSWagon copy)
1330
1438
InitialCentreOfGravityM = copy . InitialCentreOfGravityM ;
1331
1439
UnbalancedSuperElevationM = copy . UnbalancedSuperElevationM ;
1332
1440
RigidWheelBaseM = copy . RigidWheelBaseM ;
1441
+ CarBogieCentreLengthM = copy . CarBogieCentreLengthM ;
1442
+ CarBodyLengthM = copy . CarBodyLengthM ;
1443
+ CarCouplerFaceLengthM = copy . CarCouplerFaceLengthM ;
1444
+ CarAirHoseLengthM = copy . CarAirHoseLengthM ;
1333
1445
AuxTenderWaterMassKG = copy . AuxTenderWaterMassKG ;
1334
1446
TenderWagonMaxCoalMassKG = copy . TenderWagonMaxCoalMassKG ;
1335
1447
TenderWagonMaxWaterMassKG = copy . TenderWagonMaxWaterMassKG ;
1336
1448
WagonNumAxles = copy . WagonNumAxles ;
1449
+ WagonNumBogies = copy . WagonNumBogies ;
1337
1450
MSTSWagonNumWheels = copy . MSTSWagonNumWheels ;
1338
1451
MassKG = copy . MassKG ;
1339
1452
InitialMassKG = copy . InitialMassKG ;
0 commit comments