public void TrackProperties(eTrack track) { propertylist.Add(new Property { label = "Name", source=track,path = "source.name"} ); propertylist.Add(new Property { label = "ID", source=track, path = "source.id"}); propertylist.Add(new Property { label = "TrackBegin", source=track, path = "source.trackTopology.trackBegin.pos" } ); propertylist.Add(new Property { label = "TrackEnd", source = track, path = "source.trackTopology.trackEnd.pos" }); }
private static eTrack GetTrackCoords(eTrack track, string id) { int c = 0; List <double[]> list = _coordtable[id] as List <double[]>; foreach (double[] coord in list) { if (c == 0) { track.trackTopology.trackBegin.geoCoord.coord.AddRange(coord); c++; continue; } if (c == list.Count - 1) { track.trackTopology.trackEnd.geoCoord.coord.AddRange(coord); c++; continue; } else { tPlacedElement map = new tPlacedElement(); map.geoCoord.coord.AddRange(coord); track.trackElements.geoMappings.Add(map); } c++; } return(track); }
//returns orientation and coarse private static string[] GetOrientation(eTrack maintrack, eTrack sidetrack, eSwitch sw) { string[] result = new string[2]; bool trackend = false; double angle; Point switchlocation = new Point(sw.geoCoord.coord[0], sw.geoCoord.coord[1]); if (DataContainer.GetItem(sw.connection[0].@ref).FindParent(typeof(eTrackBegin)) != null) { trackend = true; } double bestdist = 9999999999999999999; List <Point> maintracknodelist = NodeList(maintrack); Point[] maintrackpoints = new Point[2]; for (int i = 0; i < maintracknodelist.Count - 1; i++) { double dist = GetDistance(maintracknodelist[i], maintracknodelist[i + 1], switchlocation); if (dist < bestdist) { maintrackpoints[0] = maintracknodelist[i]; maintrackpoints[1] = maintracknodelist[i + 1]; } } List <Point> sidetracknodelist = NodeList(sidetrack); Point[] sidetrackpoints = new Point[2]; if (trackend) { sidetrackpoints[0] = sidetracknodelist[sidetracknodelist.Count]; sidetrackpoints[1] = sidetracknodelist[sidetracknodelist.Count - 1]; } else { sidetrackpoints[0] = sidetracknodelist[0]; sidetrackpoints[1] = sidetracknodelist[1]; } angle = Math.Atan2((maintrackpoints[1] - maintrackpoints[0]).X, (maintrackpoints[1] - maintrackpoints[0]).Y) - Math.Atan2((sidetrackpoints[1] - sidetrackpoints[0]).X, (sidetrackpoints[1] - sidetrackpoints[0]).Y); if (angle > Math.PI / 4 || angle < -Math.PI / 4) { result[0] = "incoming"; } else { result[0] = "outgoing"; } if (angle < 0) { result[1] = "right"; } else { result[1] = "left"; } return(result); }
private static List <Point> NodeList(eTrack track) { List <Point> list = new List <Point>(); list.Add(new Point(track.trackTopology.trackBegin.geoCoord.coord[0], track.trackTopology.trackBegin.geoCoord.coord[1])); foreach (tPlacedElement e in track.trackElements.geoMappings) { list.Add(new Point(e.geoCoord.coord[0], e.geoCoord.coord[1])); } list.Add(new Point(track.trackTopology.trackEnd.geoCoord.coord[0], track.trackTopology.trackEnd.geoCoord.coord[1])); return(list); }
public static void AddCrossing(eTrack track1, eTrack track2, double length, double pos1, double pos2) { string id1 = DataContainer.IDGenerator("Connection"); string id2 = DataContainer.IDGenerator("Connection"); string id3 = DataContainer.IDGenerator("Connection"); string id4 = DataContainer.IDGenerator("Connection"); tConnectionData switchtotrack1 = new tConnectionData() { id = id1, @ref = id2 }; tSwitchConnectionData track1toswitch = new tSwitchConnectionData() { id = id2, @ref = id1 }; tConnectionData switchtotrack2 = new tConnectionData() { id = id3, @ref = id4 }; tSwitchConnectionData track2toswitch = new tSwitchConnectionData() { id = id4, @ref = id3 }; eTrack track = new eTrack() { id = DataContainer.IDGenerator("track") }; track.trackTopology.trackBegin.pos = 0; track.trackTopology.trackEnd.pos = (decimal)length; track.trackTopology.trackBegin.Item = switchtotrack1; track.trackTopology.trackEnd.Item = switchtotrack2; DataContainer.model.infrastructure.tracks.Add(track); eSwitch switch1 = new eSwitch() { pos = (decimal)pos1, id = DataContainer.IDGenerator("Switch") }; switch1.connection.Add(track1toswitch); track1.trackTopology.connections.Add(switch1); eSwitch switch2 = new eSwitch() { pos = (decimal)pos2, id = DataContainer.IDGenerator("Switch") }; switch1.connection.Add(track2toswitch); track2.trackTopology.connections.Add(switch2); }
public void TrackProperties(eTrack track) { propertylist.Add(new Property { label = "Name", source = track, path = "source.name" }); propertylist.Add(new Property { label = "ID", source = track, path = "source.id" }); propertylist.Add(new Property { label = "TrackBegin", source = track, path = "source.trackTopology.trackBegin.pos" }); propertylist.Add(new Property { label = "TrackEnd", source = track, path = "source.trackTopology.trackEnd.pos" }); }
public static void ConnectEnd(eTrack track1, eTrack track2) { string id1 = DataContainer.IDGenerator("connection"); string id2 = DataContainer.IDGenerator("connection"); tConnectionData connection1 = new tConnectionData() { id = id1, @ref = id2 }; tConnectionData connection2 = new tConnectionData() { id = id2, @ref = id1 }; track1.trackTopology.trackEnd.Item = connection1; track2.trackTopology.trackBegin.Item = connection2; }
public void TestButton_Click(object sender, EventArgs e) { DataContainer.model = new railml(); eTrack track1 = new eTrack{trackTopology = new eTrackTopology{trackBegin=new eTrackBegin{pos=0, geoCoord=new tGeoCoord()}, trackEnd = new eTrackEnd{pos=600, geoCoord=new tGeoCoord()}}}; DataContainer.IDGenerator(track1); track1.trackTopology.trackBegin.geoCoord.coord.Add(0); track1.trackTopology.trackBegin.geoCoord.coord.Add(0); track1.trackTopology.trackEnd.geoCoord.coord.Add(600); track1.trackTopology.trackEnd.geoCoord.coord.Add(0); eSwitch sw1 = new eSwitch() { id = "sw1" }; sw1.geoCoord.coord.AddRange(new double[] { 300, 0 }); track1.trackTopology.connections.Add(sw1); DataContainer.model.infrastructure.tracks.Add(track1); eTrack track2 = new eTrack{trackTopology = new eTrackTopology{trackBegin=new eTrackBegin{pos=0, geoCoord=new tGeoCoord()}, trackEnd = new eTrackEnd{pos=600, geoCoord=new tGeoCoord()}}}; DataContainer.IDGenerator(track2); track2.trackTopology.trackBegin.geoCoord.coord.Add(6000); track2.trackTopology.trackBegin.geoCoord.coord.Add(20); track2.trackTopology.trackEnd.geoCoord.coord.Add(8000); track2.trackTopology.trackEnd.geoCoord.coord.Add(20); DataContainer.model.infrastructure.tracks.Add(track2); Data.Editor.AddCrossing(track1, track2, 70, 300, 350); eOcp ocp1 = new eOcp { id = "34", name= "test1", geoCoord = new tGeoCoord() }; ocp1.geoCoord.coord.Add(0); ocp1.geoCoord.coord.Add(0); DataContainer.model.infrastructure.operationControlPoints.Add(ocp1); eOcp ocp2 = new eOcp { id = "443", name = "test2", geoCoord = new tGeoCoord() }; ocp2.geoCoord.coord.Add(600); ocp2.geoCoord.coord.Add(0); DataContainer.model.infrastructure.operationControlPoints.Add(ocp2); eOcp ocp3 = new eOcp { id = "344", name = "test3", geoCoord = new tGeoCoord() }; ocp3.geoCoord.coord.Add(600); ocp3.geoCoord.coord.Add(20); DataContainer.model.infrastructure.operationControlPoints.Add(ocp3); eOcp ocp4 = new eOcp { id = "343", name = "test3", geoCoord = new tGeoCoord() }; ocp4.geoCoord.coord.Add(0); ocp4.geoCoord.coord.Add(20); DataContainer.model.infrastructure.operationControlPoints.Add(ocp4); DataContainer.PrepareData(); dynamic result = DataContainer.model.infrastructure.tracks[2].trackTopology.trackBegin.FindParent(typeof(eTrack)); this.MainViewContentControl.Content = new BaseRailMLView(); }
private static void GetTracks(DataTable table) { foreach (DataRow row in table.Rows) { if (row.RowState != DataRowState.Deleted && !(bool)row["removed"])// && (string)row["ElementUsage"] != "C" && (string)row["ElementUsage"] != "F" && (string)row["ElementUsage"] != "A") { eTrack track = new eTrack() { id = (row["Serial Number"] as string) ?? null, description = (row["Description"] as string) ?? null }; track.trackTopology.trackBegin.pos = (decimal)(((row["StartMiles"] as double?) ?? 0) + ((row["StartYards"] as double?) ?? 0) / 1760); track.trackTopology.trackEnd.pos = (decimal)(((row["EndMiles"] as double?) ?? 0) + ((row["EndYards"] as double?) ?? 0) / 1760); if ((string)row["Type"] == "UR") { track.mainDir = tExtendedDirection.up; } else if ((string)row["Type"] == "DR") { track.mainDir = tExtendedDirection.down; } else { track.mainDir = tExtendedDirection.none; } if (row["Road"] is DBNull) { track.type = "connectingTrack"; } else if ((string)row["Road"] == "MAIN") { track.type = "mainTrack"; } else if ((string)row["Road"] == "BAY") { track.type = "stationTrack"; } else { track.type = "sidingTrack"; } if ((string)row["ElementUsage"] != "C" && (string)row["ElementUsage"] != "A") { track.trackDescr = new List <string>(); track.trackDescr.Add("Closed/Abandoned"); } if (row["ParentTrackElement"] != System.DBNull.Value) { eLine line = _model.infrastructure.trackGroups.line.Find(x => x.id == (string)row["Sector"]); line.trackRef.Add(new tTrackRefInGroup() { @ref = track.id }); } track = GetTrackCoords(track, row["EquipmentID"].ToString()); _model.infrastructure.tracks.Add(track); } } }
private static List <eTrack> FindHostLines(double x, double y, int n) { List <eTrack> tracks = new List <eTrack>(); Point location = new Point(x, y); int c = 0; while (c < n) { eTrack besttrack = null; double bestdist = 99999999999; foreach (eTrack track in DataContainer.model.infrastructure.tracks) { foreach (eTrack alreadyinlist in tracks) { if (track == alreadyinlist) { continue; } } Point a; Point b; a = new Point(track.trackTopology.trackBegin.geoCoord.coord[0], track.trackTopology.trackBegin.geoCoord.coord[1]); if (track.trackElements.geoMappings.Count > 0) { b = new Point(track.trackElements.geoMappings[0].geoCoord.coord[0], track.trackElements.geoMappings[0].geoCoord.coord[1]); } else { b = new Point(track.trackTopology.trackEnd.geoCoord.coord[0], track.trackTopology.trackEnd.geoCoord.coord[1]); } double dist = GetDistance(a, b, location); if (dist < bestdist) { bestdist = dist; besttrack = track; } for (int i = 0; i < track.trackElements.geoMappings.Count - 1; i++) { a = new Point(track.trackElements.geoMappings[i].geoCoord.coord[0], track.trackElements.geoMappings[i].geoCoord.coord[1]); b = new Point(track.trackElements.geoMappings[i + 1].geoCoord.coord[0], track.trackElements.geoMappings[i + 1].geoCoord.coord[1]); dist = GetDistance(a, b, location); if (dist < bestdist) { bestdist = dist; besttrack = track; } } a = new Point(track.trackTopology.trackEnd.geoCoord.coord[0], track.trackTopology.trackEnd.geoCoord.coord[1]); dist = GetDistance(a, b, location); if (dist < bestdist) { bestdist = dist; besttrack = track; } } tracks.Add(besttrack); c++; } return(tracks); }
private static eSwitch FindConnections(eSwitch tempswitch) { Point switchlocation = new Point(tempswitch.geoCoord.coord[0], tempswitch.geoCoord.coord[1]); eTrack hostline = null; eTrack track2 = null; bool trackend = false; while (track2 == null) { eTrack besttrack = null; double bestdist = 999999999999; foreach (eTrack track in DataContainer.model.infrastructure.tracks) { double dist = GetDistance(switchlocation, new Point(track.trackTopology.trackBegin.geoCoord.coord[0], track.trackTopology.trackBegin.geoCoord.coord[1])); if (dist < bestdist) { bestdist = dist; besttrack = track; trackend = false; } dist = GetDistance(switchlocation, new Point(track.trackTopology.trackEnd.geoCoord.coord[0], track.trackTopology.trackEnd.geoCoord.coord[1])); if (dist < bestdist) { bestdist = dist; besttrack = track; trackend = true; } } track2 = besttrack; } while (hostline == null) { eTrack besttrack = null; double bestdist = 99999999999; foreach (eTrack track in DataContainer.model.infrastructure.tracks) { if (track == track2) { continue; } List <Point> pointlist = NodeList(track); for (int i = 0; i < pointlist.Count - 1; i++) { double dist = GetDistance(pointlist[i], pointlist[i + 1], switchlocation); if (dist < bestdist) { bestdist = dist; besttrack = track; } } } hostline = besttrack; } tConnectionData conn1 = new tConnectionData(); DataContainer.IDGenerator(conn1); tSwitchConnectionData conn2 = new tSwitchConnectionData(); DataContainer.IDGenerator(conn2); conn1.@ref = conn2.id; conn2.@ref = conn1.id; if (trackend == true) { track2.trackTopology.trackEnd.Item = conn1; } else { track2.trackTopology.trackBegin.Item = conn1; } tempswitch.connection.Add(conn2); hostline.trackTopology.connections.Add(tempswitch); string[] orientation = GetOrientation(hostline, track2, tempswitch); tempswitch.connection[0].orientation = orientation[0]; tempswitch.connection[0].course = orientation[1]; return(tempswitch); }
public NetworkDrawingViewModel() { rendercoll = new CompositeCollection(); tracklines = new ObservableCollection <Track>(); OCPcollection = new ObservableCollection <OCP>(); switchcollection = new ObservableCollection <Switch>(); penscale = 1; for (int i = 0; i < DataContainer.model.infrastructure.tracks.Count; i++) { Track temptrack = new Track(); eTrack track = DataContainer.model.infrastructure.tracks[i]; if (track.trackTopology.trackEnd.geoCoord.coord.Count != 0 && track.trackTopology.trackBegin.geoCoord.coord.Count != 0) { temptrack.track = track; temptrack.index = i; temptrack.X1 = track.trackTopology.trackBegin.geoCoord.coord[0]; temptrack.X2 = track.trackTopology.trackEnd.geoCoord.coord[0]; temptrack.Y1 = track.trackTopology.trackBegin.geoCoord.coord[1]; temptrack.Y2 = track.trackTopology.trackEnd.geoCoord.coord[1]; temptrack.points.Add(new Point(track.trackTopology.trackBegin.geoCoord.coord[0], track.trackTopology.trackBegin.geoCoord.coord[1])); foreach (tPlacedElement point in track.trackElements.geoMappings) { temptrack.points.Add(new Point(point.geoCoord.coord[0], point.geoCoord.coord[1])); } temptrack.points.Add(new Point(track.trackTopology.trackEnd.geoCoord.coord[0], track.trackTopology.trackEnd.geoCoord.coord[1])); tracklines.Add(temptrack); foreach (tCommonSwitchAndCrossingData connection in track.trackTopology.connections) { if (connection.geoCoord.coord.Count == 2) { Switch sw = new Switch(); sw.element = connection; sw.X = connection.geoCoord.coord[0]; sw.Y = connection.geoCoord.coord[1]; switchcollection.Add(sw); } } } } foreach (eOcp ocp in DataContainer.model.infrastructure.operationControlPoints) { OCP tempocp = new OCP(); tempocp.ocp = ocp; if (ocp.geoCoord.coord.Count == 2) { tempocp.X = ocp.geoCoord.coord[0] - tempocp.diameter / 2; tempocp.Y = ocp.geoCoord.coord[1] - tempocp.diameter / 2; OCPcollection.Add(tempocp); } } rendercoll.Add(new CollectionContainer() { Collection = tracklines }); rendercoll.Add(new CollectionContainer() { Collection = OCPcollection }); rendercoll.Add(new CollectionContainer() { Collection = switchcollection }); }
public void TestButton_Click(object sender, EventArgs e) { DataContainer.model = new railml(); eTrack track1 = new eTrack { trackTopology = new eTrackTopology { trackBegin = new eTrackBegin { pos = 0, geoCoord = new tGeoCoord() }, trackEnd = new eTrackEnd { pos = 600, geoCoord = new tGeoCoord() } } }; DataContainer.IDGenerator(track1); track1.trackTopology.trackBegin.geoCoord.coord.Add(0); track1.trackTopology.trackBegin.geoCoord.coord.Add(0); track1.trackTopology.trackEnd.geoCoord.coord.Add(600); track1.trackTopology.trackEnd.geoCoord.coord.Add(0); eSwitch sw1 = new eSwitch() { id = "sw1" }; sw1.geoCoord.coord.AddRange(new double[] { 300, 0 }); track1.trackTopology.connections.Add(sw1); DataContainer.model.infrastructure.tracks.Add(track1); eTrack track2 = new eTrack { trackTopology = new eTrackTopology { trackBegin = new eTrackBegin { pos = 0, geoCoord = new tGeoCoord() }, trackEnd = new eTrackEnd { pos = 600, geoCoord = new tGeoCoord() } } }; DataContainer.IDGenerator(track2); track2.trackTopology.trackBegin.geoCoord.coord.Add(6000); track2.trackTopology.trackBegin.geoCoord.coord.Add(20); track2.trackTopology.trackEnd.geoCoord.coord.Add(8000); track2.trackTopology.trackEnd.geoCoord.coord.Add(20); DataContainer.model.infrastructure.tracks.Add(track2); Data.Editor.AddCrossing(track1, track2, 70, 300, 350); eOcp ocp1 = new eOcp { id = "34", name = "test1", geoCoord = new tGeoCoord() }; ocp1.geoCoord.coord.Add(0); ocp1.geoCoord.coord.Add(0); DataContainer.model.infrastructure.operationControlPoints.Add(ocp1); eOcp ocp2 = new eOcp { id = "443", name = "test2", geoCoord = new tGeoCoord() }; ocp2.geoCoord.coord.Add(600); ocp2.geoCoord.coord.Add(0); DataContainer.model.infrastructure.operationControlPoints.Add(ocp2); eOcp ocp3 = new eOcp { id = "344", name = "test3", geoCoord = new tGeoCoord() }; ocp3.geoCoord.coord.Add(600); ocp3.geoCoord.coord.Add(20); DataContainer.model.infrastructure.operationControlPoints.Add(ocp3); eOcp ocp4 = new eOcp { id = "343", name = "test3", geoCoord = new tGeoCoord() }; ocp4.geoCoord.coord.Add(0); ocp4.geoCoord.coord.Add(20); DataContainer.model.infrastructure.operationControlPoints.Add(ocp4); DataContainer.PrepareData(); dynamic result = DataContainer.model.infrastructure.tracks[2].trackTopology.trackBegin.FindParent(typeof(eTrack)); this.MainViewContentControl.Content = new BaseRailMLView(); }