public static ServiceVolumeTableFDOT ChangeTestParameterValue(ServiceVolumeTableFDOT Table, string testParameter, float testParameterValue) { if (testParameter == "g / C") { Table.Signal.EffGreenToCycleLengthRatio = testParameterValue; } else if (testParameter == "Posted Speed") { Table.Roadway.PostedSpeedMPH = (byte)testParameterValue; } else if (testParameter == "Pct. Heavy Vehicles") { Table.Traffic.PctHeavyVeh = testParameterValue; } else if (testParameter == "Base Sat Flow") { Table.Traffic.BaseSatFlow = (int)testParameterValue; } else if (testParameter == "Segment Length") { Table.Roadway.SegmentLengthFt = (int)testParameterValue; Table.Roadway.ArterialLenghtFt = Table.Roadway.NumSegments * Table.Roadway.SegmentLengthFt; Table.Roadway.FacilityLengthMiles = Table.Roadway.ArterialLenghtFt / 5280; } return(Table); }
public ArterialData(ServiceVolumeTableFDOT Inputs, List <SegmentData> segments) { _artName = ""; _from = ""; _to = ""; _lengthMiles = Inputs.Roadway.FacilityLengthMiles; _dir = Inputs.Roadway.AnalysisTravelDir; _area = Inputs.SerVolAreaType; _class = Inputs.Class; _segments = segments; _Dfactor = Inputs.Traffic.DFactor; _Kfactor = Inputs.Traffic.KFactor; _thresholds = new ThresholdData(); _results = new ResultsArterialData(); }
/*private void bgwRunServiceVolsCalcs_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) * { * Project = new ProjectData(AnalysisMode.Planning); * * string testParameter = this.cboTestParameter.Text; * float[] testParameterBoundaries = ServiceVolumeArterialInputs.GetTestParameterValues(testParameter); * List<ServiceVolumes> serviceVolResults = new List<ServiceVolumes>(); * * for (float iterateBoundary = testParameterBoundaries[0]; iterateBoundary <= testParameterBoundaries[1]; iterateBoundary += testParameterBoundaries[2]) * { * ServiceVolumes SerVols = new ServiceVolumes(iterateBoundary, testParameter); * ServiceVolumeArterialInputs InputsOneLane = new ServiceVolumeArterialInputs(false, testParameter, iterateBoundary); * ServiceVolumeArterialInputs InputsMultiLane = new ServiceVolumeArterialInputs(true, testParameter, iterateBoundary); * this.lblIteration.Text = "Iteration: " + Math.Round(iterateBoundary,2).ToString(); * CalcsServiceVolumes.ServiceVolsAuto(Project, SerVols, InputsOneLane, InputsMultiLane); * serviceVolResults.Add(SerVols); * } * //e.Cancel = true; * ServiceVolResultsOutput.WriteServiceVolResultsData("Service Volume Outputs.csv", serviceVolResults); * * //ServiceVolumeArterialInputs InputsOneLane = new ServiceVolumeArterialInputs(false, TestParameter, 0); * //ServiceVolumeArterialInputs InputsMultiLane = new ServiceVolumeArterialInputs(true, TestParameter, 0); * //CalcsServiceVolumes.ServiceVolsAuto(Project, SerVols, InputsOneLane, InputsMultiLane); * }*/ private void bgwRunServiceVolsCalcs_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { if (SerVolTables.Count == 0) { MessageBox.Show("Please read in a Service Volumes Input File first."); } else { Project = new ProjectData(AnalysisMode.Planning); string testParameter = this.cboTestParameter.Text; float[] testParameterBoundaries = ServiceVolumeArterialInputs.GetTestParameterValues(testParameter); int numberOfTestParmsPerTable = (int)(((testParameterBoundaries[1] - testParameterBoundaries[0]) / testParameterBoundaries[2]) + 1); List <ServiceVolumes> serviceVolResults = new List <ServiceVolumes>(); foreach (SerVolTablesByClass SerVolTablesForClasses in SerVolTables) { foreach (SerVolTablesByMultiLane SerVolTablesForNumLanes in SerVolTablesForClasses.SerVolTablesMultiLane) { for (float iterateBoundary = testParameterBoundaries[0]; iterateBoundary <= testParameterBoundaries[1]; iterateBoundary += testParameterBoundaries[2]) { ServiceVolumes SerVols = new ServiceVolumes(iterateBoundary, testParameter, SerVolTablesForClasses.ArtAreaType, SerVolTablesForNumLanes.ArtClass); SerVolTablesForNumLanes.SerVolTables[0] = ServiceVolumeTableFDOT.ChangeTestParameterValue(SerVolTablesForNumLanes.SerVolTables[0], testParameter, iterateBoundary); SerVolTablesForNumLanes.SerVolTables[1] = ServiceVolumeTableFDOT.ChangeTestParameterValue(SerVolTablesForNumLanes.SerVolTables[1], testParameter, iterateBoundary); this.lblIteration.Text = "Iteration: " + Math.Round(iterateBoundary, 2).ToString(); CalcsServiceVolumes.ServiceVolsAutoNew(Project, SerVols, SerVolTablesForNumLanes.SerVolTables[0], SerVolTablesForNumLanes.SerVolTables[1]); serviceVolResults.Add(SerVols); } } } ServiceVolResultsOutput.WriteServiceVolResultsDataNew("Service Volume Outputs.csv", serviceVolResults, numberOfTestParmsPerTable); MessageBox.Show("Calculations Finished! Please check out the \"Service Volume Outputs.csv\" file."); } }
/// <summary> /// Creates the Service Volumes for an arterial based on input parameters. /// </summary> /// <param name="Project"></param> /// <param name="SerVol"></param> /// <param name="inputsOneLane"></param> /// <param name="inputsMultiLane"></param> /*public static void ServiceVolsAuto(ProjectData Project, ServiceVolumes SerVol, ServiceVolumeArterialInputs * inputsOneLane, ServiceVolumeArterialInputs inputsMultiLane) * { * * float NumberOfLoops = 5 * 5; //This accounts for LOS and Lanes, does not account for volume increments; Type is float just to avoid extra cast in calculations below * int LoopCounter = 0; * frmMain.bgwRunServiceVolsCalcs.ReportProgress(0); * * ArterialData Arterial = new ArterialData(); * for (int lanes = 0; lanes < 5; lanes++) // 2,4,6,8,* * { * int vol = 40; // Starting volume (volume entering upstream of first intersection) * bool threshExceeded = false; * * // Variable access points * * ServiceVolumeArterialInputs inputsForArterialCreation = inputsOneLane; * if (lanes > 0) * inputsForArterialCreation = inputsMultiLane; * * if (lanes != 4) * Arterial = CreateArterial_FDOTSerVols.NewArterial(inputsForArterialCreation, vol, lanes + 1); * else * Arterial = CreateArterial_FDOTSerVols.NewArterial(inputsForArterialCreation, vol); * * for (int LOSlevel = 0; LOSlevel < 5; LOSlevel++) // LOS A-E * { * LoopCounter++; * * int[] ServiceVolsArray; * do * { * CreateArterial_FDOTSerVols.ChangeArterialVolume(ref Arterial, vol); * Arterial.TestSerVol = vol; * CalcsArterial.CalcResults(Project, ref Arterial); * * if (!Arterial.OverCapacity) * { * // Check whether LOS speed threshold has been exceeded * if (Arterial.Results.AverageSpeed < Arterial.Thresholds.Speed[LOSlevel]) // Avg. speed below LOS threshold speed * { * vol -= 10; * threshExceeded = true; * if (vol <= 0) * { * vol = 10; * SerVol.PkDirVol[lanes, LOSlevel] = -1; * SerVol.BothDirVol[lanes, LOSlevel] = -1; * SerVol.AADT[lanes, LOSlevel] = -1; * SerVol.Found[lanes, LOSlevel] = true; * } * } * else * { * if (threshExceeded == false) // Threshold not exceeded, increment volume * { * if ((Arterial.Results.AverageSpeed - Arterial.Thresholds.Speed[LOSlevel]) > 5) * vol += (30 * (lanes + 1) * (LOSlevel + 1)); * else * vol += 10; * } * else // Threshold exceeded, record volume for LOS level * { * if (LOSlevel > 0) * ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, SerVol.PkDirVol[lanes, LOSlevel - 1]); * else * ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, -1); * SerVol.PkDirVol[lanes, LOSlevel] = ServiceVolsArray[0]; * SerVol.BothDirVol[lanes, LOSlevel] = ServiceVolsArray[1]; * SerVol.AADT[lanes, LOSlevel] = ServiceVolsArray[2]; * SerVol.Found[lanes, LOSlevel] = true; * vol += 10; // Increment volume for start of next LOS level * threshExceeded = false; * } * } * } * else // Check to see if there is a constraining intersection due to (v/c * PHF) > 1 * { * vol -= 10; // Return to the previous non-capacity-constrained volume * for (int capCheckLOSlevel = LOSlevel + 1; capCheckLOSlevel < 5; capCheckLOSlevel++) // LOS A-E * { * SerVol.PkDirVol[lanes, capCheckLOSlevel] = -2; * SerVol.BothDirVol[lanes, capCheckLOSlevel] = -2; * SerVol.AADT[lanes, capCheckLOSlevel] = -2; * SerVol.Found[lanes, capCheckLOSlevel] = true; * } * if (LOSlevel > 0) * ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, SerVol.PkDirVol[lanes, LOSlevel - 1]); * else * ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, -1); * SerVol.PkDirVol[lanes, LOSlevel] = ServiceVolsArray[0]; * SerVol.BothDirVol[lanes, LOSlevel] = ServiceVolsArray[1]; * SerVol.AADT[lanes, LOSlevel] = ServiceVolsArray[2]; * SerVol.Found[lanes, LOSlevel] = true; * } * } * while (SerVol.Found[lanes, LOSlevel] == false); //loop until service vol reached for given LOS * if (Arterial.OverCapacity) * { * LoopCounter = 5 * (lanes + 1); * frmMain.bgwRunServiceVolsCalcs.ReportProgress((int)(Math.Round(LoopCounter / NumberOfLoops * 100, 0, MidpointRounding.AwayFromZero))); * break; * } * frmMain.bgwRunServiceVolsCalcs.ReportProgress((int)(Math.Round(LoopCounter / NumberOfLoops * 100, 0, MidpointRounding.AwayFromZero))); * } // BP here to view service volumes by LOS * } // BP here to view service volumes by number of lanes * } // BP here to view all service volumes*/ public static void ServiceVolsAutoNew(ProjectData Project, ServiceVolumes SerVol, ServiceVolumeTableFDOT inputsOneLane, ServiceVolumeTableFDOT inputsMultiLane) { float NumberOfLoops = 5 * 5; //This accounts for LOS and Lanes, does not account for volume increments; Type is float just to avoid extra cast in calculations below int LoopCounter = 0; frmMain.bgwRunServiceVolsCalcs.ReportProgress(0); ArterialData Arterial = new ArterialData(); for (int lanes = 0; lanes < 5; lanes++) // 2,4,6,8,* { int vol = 40; // Starting volume (volume entering upstream of first intersection) bool threshExceeded = false; // Variable access points ServiceVolumeTableFDOT inputsForArterialCreation = inputsOneLane; if (lanes > 0) { inputsForArterialCreation = inputsMultiLane; } if (lanes != 4) { Arterial = CreateArterial_FDOTSerVols.NewArterial(inputsForArterialCreation, Project.AnalMode, vol, lanes + 1); } else { Arterial = CreateArterial_FDOTSerVols.NewArterial(inputsForArterialCreation, Project.AnalMode, vol); } for (int LOSlevel = 0; LOSlevel < 5; LOSlevel++) // LOS A-E { LoopCounter++; int[] ServiceVolsArray; do { CreateArterial_FDOTSerVols.ChangeArterialVolume(ref Arterial, vol); Arterial.TestSerVol = vol; CalcsArterial.CalcResults(Project, ref Arterial); if (!Arterial.OverCapacity) { // Check whether LOS speed threshold has been exceeded if (Arterial.Results.AverageSpeed < Arterial.Thresholds.Speed[LOSlevel]) // Avg. speed below LOS threshold speed { vol -= 10; threshExceeded = true; if (vol <= 0) { vol = 10; SerVol.PkDirVol[lanes, LOSlevel] = -1; SerVol.BothDirVol[lanes, LOSlevel] = -1; SerVol.AADT[lanes, LOSlevel] = -1; SerVol.Found[lanes, LOSlevel] = true; } } else { if (threshExceeded == false) // Threshold not exceeded, increment volume { if ((Arterial.Results.AverageSpeed - Arterial.Thresholds.Speed[LOSlevel]) > 5) { vol += (30 * (lanes + 1) * (LOSlevel + 1)); } else { vol += 10; } } else // Threshold exceeded, record volume for LOS level { //vol += 10; if (LOSlevel > 0) { ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, SerVol.PkDirVol[lanes, LOSlevel - 1]); } else { ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, -1); } SerVol.PkDirVol[lanes, LOSlevel] = ServiceVolsArray[0]; SerVol.BothDirVol[lanes, LOSlevel] = ServiceVolsArray[1]; SerVol.AADT[lanes, LOSlevel] = ServiceVolsArray[2]; SerVol.Found[lanes, LOSlevel] = true; vol += 10; // Increment volume for start of next LOS level threshExceeded = false; } } } else // Check to see if there is a constraining intersection due to (v/c * PHF) > 1 { vol -= 10; // Return to the previous non-capacity-constrained volume for (int capCheckLOSlevel = LOSlevel + 1; capCheckLOSlevel < 5; capCheckLOSlevel++) // LOS A-E { SerVol.PkDirVol[lanes, capCheckLOSlevel] = -2; SerVol.BothDirVol[lanes, capCheckLOSlevel] = -2; SerVol.AADT[lanes, capCheckLOSlevel] = -2; SerVol.Found[lanes, capCheckLOSlevel] = true; } if (LOSlevel > 0) { ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, SerVol.PkDirVol[lanes, LOSlevel - 1]); } else { ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, -1); } SerVol.PkDirVol[lanes, LOSlevel] = ServiceVolsArray[0]; SerVol.BothDirVol[lanes, LOSlevel] = ServiceVolsArray[1]; SerVol.AADT[lanes, LOSlevel] = ServiceVolsArray[2]; SerVol.Found[lanes, LOSlevel] = true; } }while (SerVol.Found[lanes, LOSlevel] == false); //loop until service vol reached for given LOS threshExceeded = false; if (Arterial.OverCapacity) { LoopCounter = 5 * (lanes + 1); frmMain.bgwRunServiceVolsCalcs.ReportProgress((int)(Math.Round(LoopCounter / NumberOfLoops * 100, 0, MidpointRounding.AwayFromZero))); break; } frmMain.bgwRunServiceVolsCalcs.ReportProgress((int)(Math.Round(LoopCounter / NumberOfLoops * 100, 0, MidpointRounding.AwayFromZero))); } // BP here to view service volumes by LOS } // BP here to view service volumes by number of lanes } // BP here to view all service volumes
public static ArterialData NewArterial(ServiceVolumeTableFDOT arterialInputs, AnalysisMode ProjectAnalMode, float analysisDirectionDemandVol = 800, int numLanes = 2) { arterialInputs.Signal.EffGreen = arterialInputs.Signal.CalcEffectiveGreen(arterialInputs.Signal.EffGreenToCycleLengthRatio, arterialInputs.Signal.CycleLengthSec); arterialInputs.Signal.EffGreenLeft = arterialInputs.Signal.CalcEffectiveGreen(0.1f, arterialInputs.Signal.CycleLengthSec); List <SegmentData> Segments = new List <SegmentData>(); IntersectionData newIntersection = CreateIntersection(numLanes, arterialInputs.Signal.CycleLengthSec, arterialInputs.SerVolAreaType, ProjectAnalMode); newIntersection.Signal.ControlType = arterialInputs.Signal.SigType; LinkData newLink; float segmentLength; for (int intIndex = 0; intIndex < arterialInputs.Roadway.NumIntersections; intIndex++) { if (intIndex == 0) { segmentLength = 0; } else { segmentLength = arterialInputs.Roadway.ArterialLenghtFt / (arterialInputs.Roadway.NumIntersections - 1); } newLink = new LinkData(segmentLength - newIntersection.CrossStreetWidth, numLanes, arterialInputs.Roadway.PostedSpeedMPH, arterialInputs.Roadway.PropCurbRightSide, arterialInputs.Roadway.Median); Segments.Add(new SegmentData(intIndex, newLink, newIntersection, arterialInputs.SerVolAreaType, arterialInputs.Roadway.PostedSpeedMPH, newIntersection.CrossStreetWidth)); } ArterialData newArterial = new ArterialData(arterialInputs, Segments); ChangeArterialVolume(ref newArterial, analysisDirectionDemandVol); // Calcs Arterial code foreach (SegmentData segment in newArterial.Segments) { foreach (ApproachData approach in segment.Intersection.Approaches) { approach.PctLeftTurns = arterialInputs.Traffic.PctLeftTurns; approach.PctRightTurns = arterialInputs.Traffic.PctRightTurns; foreach (LaneGroupData laneGroup in approach.LaneGroups) { if (laneGroup.Type == LaneMovementsAllowed.LeftOnly) { laneGroup.SignalPhase.GreenEffectiveSec = arterialInputs.Signal.EffGreenLeft; laneGroup.TurnBayLeftLengthFeet = arterialInputs.Roadway.TurnBayLeftLengthFeet; } else { laneGroup.SignalPhase.GreenEffectiveSec = arterialInputs.Signal.EffGreen; } laneGroup.BaseSatFlow = arterialInputs.Traffic.BaseSatFlow; laneGroup.PctHeavyVehicles = arterialInputs.Traffic.PctHeavyVeh; laneGroup.ArvType = arterialInputs.Signal.ArvType; float[] PlatoonRatioValues = new float[] { 0.333f, 0.667f, 1.0f, 1.333f, 1.667f, 2.0f }; laneGroup.PlatoonRatio = PlatoonRatioValues[laneGroup.ArvType - 1]; laneGroup.PeakHourFactor = arterialInputs.Traffic.PHF; } } } newArterial.Thresholds.Delay = newArterial.Thresholds.GetLOSBoundaries_Delay(newArterial.Area); newArterial.Thresholds.Speed = newArterial.Thresholds.GetLOSBoundaries_Speed(arterialInputs.Roadway.PostedSpeedMPH); newArterial.AnalysisTravelDir = arterialInputs.Roadway.AnalysisTravelDir; return(newArterial); }
public static SerVolTablesByMultiLane CreateServiceVolTableFDOT(AreaType SerVolAreaType, ArterialClass ArtClass) { ServiceVolumeTableFDOT SerVolTableSingleLane = new ServiceVolumeTableFDOT(SerVolAreaType, ArtClass, false); ServiceVolumeTableFDOT SerVolTableMultiLane = new ServiceVolumeTableFDOT(SerVolAreaType, ArtClass, true); // Sample Structure: // public RoadwayData(bool multiLane, byte postedSpeedMPH, byte freeFlowSpeedMPH, MedianType median, TerrainType terrain, bool exclusiveLeftTurns, bool exclusiveRightTurns, byte facilityLengthMiles, byte numIntersections, byte accessPointsPerMile) switch (SerVolAreaType) { case AreaType.LargeUrbanized: // Urbanized: Tables 1, 4, 7 switch (ArtClass) { case ArterialClass.ClassI: SerVolTableSingleLane.Roadway = new RoadwayData(45, 50, MedianType.None, TerrainType.Level, true, false, 2, 5, 2); SerVolTableSingleLane.Traffic = new TrafficData(0.09f, 0.55f, 1.0f, 1950, 1.0f, 12, 12); SerVolTableSingleLane.Signal = new SignalData(4, 3, SigControlType.CoordinatedActuated, 120, 0.44f); SerVolTableMultiLane.Roadway = new RoadwayData(50, 55, MedianType.Restrictive, TerrainType.Level, true, false, 2, 5, 2); SerVolTableMultiLane.Traffic = new TrafficData(0.09f, 0.56f, 1.0f, 1950, 1.0f, 12, 12); SerVolTableMultiLane.Signal = new SignalData(4, 3, SigControlType.CoordinatedActuated, 150, 0.45f); break; case ArterialClass.ClassII: SerVolTableSingleLane.Roadway = new RoadwayData(30, 35, MedianType.None, TerrainType.Level, true, false, 1.9f, 11, 2); SerVolTableSingleLane.Traffic = new TrafficData(0.09f, 0.565f, 1.0f, 1950, 1.0f, 12, 12); SerVolTableSingleLane.Signal = new SignalData(10, 4, SigControlType.CoordinatedActuated, 120, 0.44f); SerVolTableMultiLane.Roadway = new RoadwayData(30, 35, MedianType.Restrictive, TerrainType.Level, true, false, 1.8f, 11, 2); SerVolTableMultiLane.Traffic = new TrafficData(0.09f, 0.56f, 1.0f, 1950, 1.0f, 12, 12); SerVolTableMultiLane.Signal = new SignalData(10, 4, SigControlType.CoordinatedActuated, 120, 0.44f); break; } break; case AreaType.Transitioning: // Transitioning / Urban: Tables 2, 5, 8 switch (ArtClass) { case ArterialClass.ClassI: SerVolTableSingleLane.Roadway = new RoadwayData(45, 50, MedianType.None, TerrainType.Level, true, false, 1.8f, 6, 2); SerVolTableSingleLane.Traffic = new TrafficData(0.09f, 0.55f, 1.0f, 1950, 2.0f, 12, 12); SerVolTableSingleLane.Signal = new SignalData(5, 4, SigControlType.CoordinatedActuated, 120, 0.44f); SerVolTableMultiLane.Roadway = new RoadwayData(50, 55, MedianType.Restrictive, TerrainType.Level, true, false, 2, 5, 2); SerVolTableMultiLane.Traffic = new TrafficData(0.09f, 0.57f, 1.0f, 1950, 3.0f, 12, 12); SerVolTableMultiLane.Signal = new SignalData(4, 3, SigControlType.CoordinatedActuated, 150, 0.45f); break; case ArterialClass.ClassII: SerVolTableSingleLane.Roadway = new RoadwayData(30, 35, MedianType.None, TerrainType.Level, true, false, 2, 11, 2); SerVolTableSingleLane.Traffic = new TrafficData(0.09f, 0.57f, 1.0f, 1950, 2.0f, 12, 12); SerVolTableSingleLane.Signal = new SignalData(10, 4, SigControlType.CoordinatedActuated, 120, 0.44f); SerVolTableMultiLane.Roadway = new RoadwayData(30, 35, MedianType.Restrictive, TerrainType.Level, true, false, 2, 11, 2); SerVolTableMultiLane.Traffic = new TrafficData(0.09f, 0.565f, 1.0f, 1950, 3.0f, 12, 12); SerVolTableMultiLane.Signal = new SignalData(10, 4, SigControlType.CoordinatedActuated, 150, 0.45f); break; } break; case AreaType.RuralDeveloped: // Rural Developed / Undeveloped: Tables 3, 6, 9. No arterial class differentiation SerVolTableSingleLane.Roadway = new RoadwayData(45, 50, MedianType.None, TerrainType.Level, true, false, 1.9f, 6, 2); SerVolTableSingleLane.Traffic = new TrafficData(0.095f, 0.55f, 1.0f, 1950, 3.0f, 12, 12); SerVolTableSingleLane.Signal = new SignalData(5, 3, SigControlType.CoordinatedActuated, 90, 0.44f); SerVolTableMultiLane.Roadway = new RoadwayData(45, 50, MedianType.Restrictive, TerrainType.Level, true, false, 2.2f, 7, 2); SerVolTableMultiLane.Traffic = new TrafficData(0.095f, 0.55f, 1.0f, 1950, 3.0f, 12, 12); SerVolTableMultiLane.Signal = new SignalData(6, 3, SigControlType.CoordinatedActuated, 90, 0.44f); break; } return(new SerVolTablesByMultiLane(ArtClass, SerVolTableSingleLane, SerVolTableMultiLane)); }