@@ -419,6 +419,18 @@ public virtual void LoadFromWagFile(string wagFilePath)
419419 RearCouplerShapeFileName = null ;
420420 }
421421
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+
422434 // If trailing loco resistance constant has not been defined in WAG/ENG file then assign default value based upon orig Davis values
423435 if ( TrailLocoResistanceFactor == 0 )
424436 {
@@ -436,6 +448,40 @@ public virtual void LoadFromWagFile(string wagFilePath)
436448 }
437449 }
438450
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+
439485 // Ensure Drive Axles is set to a default if no OR value added to WAG file
440486 if ( WagonNumAxles == 0 )
441487 {
@@ -964,6 +1010,10 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
9641010 CarLengthM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
9651011 stf . SkipRestOfBlock ( ) ;
9661012 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 ;
9671017 case "wagon(ortstrackgauge" :
9681018 stf . MustMatch ( "(" ) ;
9691019 TrackGaugeM = stf . ReadFloat ( STFReader . UNITS . Distance , null ) ;
@@ -1121,6 +1171,15 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
11211171 stf . SkipRestOfBlock ( ) ;
11221172 break ;
11231173
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+
11241183 case "wagon(coupling(rearcoupleranim" :
11251184 stf . MustMatch ( "(" ) ;
11261185 RearCouplerShapeFileName = stf . ReadString ( ) ;
@@ -1130,7 +1189,16 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
11301189 stf . SkipRestOfBlock ( ) ;
11311190 break ;
11321191
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" :
11341202 stf . MustMatch ( "(" ) ;
11351203 Couplers [ CouplerCountLocation ] . SetTensionStiffness ( stf . ReadFloat ( STFReader . UNITS . Force , null ) , stf . ReadFloat ( STFReader . UNITS . Force , null ) ) ;
11361204 stf . SkipRestOfBlock ( ) ;
@@ -1156,6 +1224,25 @@ public virtual void Parse(string lowercasetoken, STFReader stf)
11561224 stf . SkipRestOfBlock ( ) ;
11571225 break ;
11581226
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+
11591246 case "wagon(coupling(spring(ortscompressionstiffness" :
11601247 stf . MustMatch ( "(" ) ;
11611248 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)
12471334 case "wagon(orts3dcab" : Parse3DCab ( stf ) ; break ;
12481335 case "wagon(numwheels" : MSTSWagonNumWheels = stf . ReadFloatBlock ( STFReader . UNITS . None , 4.0f ) ; break ;
12491336 case "wagon(ortsnumberaxles" : WagonNumAxles = stf . ReadIntBlock ( null ) ; break ;
1250-
1337+ case "wagon(ortsnumberbogies" : WagonNumBogies = stf . ReadIntBlock ( null ) ; break ;
12511338 case "wagon(ortspantographs" :
12521339 Pantographs . Parse ( lowercasetoken , stf ) ;
12531340 break ;
@@ -1322,6 +1409,27 @@ public virtual void Copy(MSTSWagon copy)
13221409 RearCouplerOpenAnimHeightM = copy . RearCouplerOpenAnimHeightM ;
13231410 RearCouplerOpenAnimLengthM = copy . RearCouplerOpenAnimLengthM ;
13241411 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+
13251433 CarWidthM = copy . CarWidthM ;
13261434 CarHeightM = copy . CarHeightM ;
13271435 CarLengthM = copy . CarLengthM ;
@@ -1330,10 +1438,15 @@ public virtual void Copy(MSTSWagon copy)
13301438 InitialCentreOfGravityM = copy . InitialCentreOfGravityM ;
13311439 UnbalancedSuperElevationM = copy . UnbalancedSuperElevationM ;
13321440 RigidWheelBaseM = copy . RigidWheelBaseM ;
1441+ CarBogieCentreLengthM = copy . CarBogieCentreLengthM ;
1442+ CarBodyLengthM = copy . CarBodyLengthM ;
1443+ CarCouplerFaceLengthM = copy . CarCouplerFaceLengthM ;
1444+ CarAirHoseLengthM = copy . CarAirHoseLengthM ;
13331445 AuxTenderWaterMassKG = copy . AuxTenderWaterMassKG ;
13341446 TenderWagonMaxCoalMassKG = copy . TenderWagonMaxCoalMassKG ;
13351447 TenderWagonMaxWaterMassKG = copy . TenderWagonMaxWaterMassKG ;
13361448 WagonNumAxles = copy . WagonNumAxles ;
1449+ WagonNumBogies = copy . WagonNumBogies ;
13371450 MSTSWagonNumWheels = copy . MSTSWagonNumWheels ;
13381451 MassKG = copy . MassKG ;
13391452 InitialMassKG = copy . InitialMassKG ;
0 commit comments