//================================================================================================// /// <summary> /// Constructor for speedposts /// </summary> public SignalHead(Signal signal, int trackItem, int tbdRef, SpeedPostItem speedItem) { if (speedItem == null) { throw new ArgumentNullException(nameof(speedItem)); } MainSignal = signal ?? throw new ArgumentNullException(nameof(signal)); TrackItemIndex = trackItem; TDBIndex = tbdRef; DrawState = 1; SignalIndicationState = SignalAspectState.Clear_2; SignalType = new SignalType(SignalFunction.Speed, SignalAspectState.Clear_2); double speedMpS = Speed.MeterPerSecond.ToMpS(speedItem.Distance, !speedItem.IsMPH); if (speedItem.IsResume) { speedMpS = 999.0; } float passSpeed = speedItem.IsPassenger ? (float)speedMpS : -1; float freightSpeed = speedItem.IsFreight ? (float)speedMpS : -1; SpeedInfoSet[SignalIndicationState] = new SpeedInfo(passSpeed, freightSpeed, false, false, speedItem is TempSpeedPostItem ? (speedMpS == 999f ? 2 : 1) : 0, speedItem.IsWarning); }
/// <summary> /// Constructor /// </summary> /// <param name="item">The original track item</param> /// <param name="travellerAtItem">The traveller located at the location of the track item</param> public ChartableTrackItem(TrItem item, Traveller travellerAtItem) { this.Height = item.Y; this.ItemText = string.Empty; this.ItemType = ChartableTrackItemType.Station; switch (item.ItemType) { case TrItem.trItemType.trEMPTY: break; case TrItem.trItemType.trCROSSOVER: break; case TrItem.trItemType.trSIGNAL: break; case TrItem.trItemType.trSPEEDPOST: SpeedPostItem speedPost = item as SpeedPostItem; this.ItemText = speedPost.SpeedInd.ToString(System.Globalization.CultureInfo.CurrentCulture); if (speedPost.IsMilePost) { this.ItemType = ChartableTrackItemType.MilePost; } if (speedPost.IsLimit) { float relativeAngle = Microsoft.Xna.Framework.MathHelper.WrapAngle(travellerAtItem.RotY + speedPost.Angle - (float)Math.PI / 2); bool inSameDirection = Math.Abs(relativeAngle) < Math.PI / 2; if (inSameDirection) { this.ItemType = ChartableTrackItemType.SpeedLimitForward; } else { this.ItemType = ChartableTrackItemType.SpeedLimitReverse; } } break; case TrItem.trItemType.trPLATFORM: this.ItemText = (item as PlatformItem).Station; this.ItemType = ChartableTrackItemType.Station; break; case TrItem.trItemType.trSOUNDREGION: break; case TrItem.trItemType.trXING: break; case TrItem.trItemType.trSIDING: break; case TrItem.trItemType.trHAZZARD: break; case TrItem.trItemType.trPICKUP: break; case TrItem.trItemType.trCARSPAWNER: break; default: break; } this.TrackVectorSectionIndex = travellerAtItem.TrackVectorSectionIndex; var travellerAtSectionStart = new Traveller(travellerAtItem); travellerAtSectionStart.MoveInSection(float.MinValue); // Move to begin of section this.TrackVectorSectionOffset = travellerAtItem.TrackNodeOffset - travellerAtSectionStart.TrackNodeOffset; }
/// <summary> /// Default constructor /// </summary> /// <param name="originalTrItem">The original track item that we are representing for drawing</param> public DrawableSpeedPostItem(TrackItem originalTrItem) : base(originalTrItem) { Description = "speedpost"; originalItem = originalTrItem as SpeedPostItem; }