List <streckenModul> routeSearch(streckenModul Aktuell, streckenModul Ziel, List <streckenModul> Besucht) { Besucht.Add(Aktuell); if (Aktuell == Ziel) { var Lizte = new List <streckenModul>(); Lizte.Add(Aktuell); return(Lizte); } else { foreach (var con in Aktuell.Verbindungen) { if (!(Besucht.Contains(con))) { var rList = routeSearch(con, Ziel, Besucht); if (!(rList == null)) { rList.Insert(0, Aktuell); return(rList); } } } } return(null); }
public int getStationDistance(streckenModul mod, int X, int Y) { int deltaX = mod.PIX_X - X; int deltaY = mod.PIX_Y - Y; int dist = (int)Math.Sqrt(deltaX * deltaX + deltaY * deltaY); return(dist); }
streckenModul modulEinlesen(string Speicherort) { streckenModul aktMod = new streckenModul(Speicherort); if (!aktMod.isSane) { return(null); } return(aktMod); }
bool isVisible(streckenModul mod) { double ax = border_east - border_west; double ay = border_north - border_south; double halfDiag = Math.Sqrt(ax * ax + ay * ay) * 0.5; double dx = mod.UTM_WE - center_WE; double dy = mod.UTM_NS - center_NS; double dist = Math.Sqrt(dx * dx + dy * dy); return(dist < (mod.drawDist + halfDiag)); }
public streckenModul getNearestStation(int X, int Y) { double dist = -1; streckenModul nearestMod = null; if (modVisible.Count == 0) { return(null); } foreach (streckenModul mod in modVisible) { double modDist = getStationDistance(mod, X, Y); if (((dist > modDist) || (dist == -1)) && !(modDist < 0)) { dist = modDist; nearestMod = mod; } } return(nearestMod); }
private void mMap_MouseUp(object sender, MouseEventArgs e) { if (mouseDown && (e.Button == MouseButtons.Left)) { mouseDown = false; int deltaX = e.X - mouseDownX_rel; int deltaY = e.Y - mouseDownY_rel; if ((selectRouteStart || selectRouteEnd) && !mouseMoved) { var act = (ZugFahrt)ZugFahrtBox.SelectedItem; if (selectRouteStart) { act.ZstartSignal = kartenZeichner.getNearestSignalStartZiel(e.X, e.Y, true); kartenZeichner.setLayers("signal_ziel", true); this.Invalidate(); selectRouteStart = false; } else { act.ZzielSignal = kartenZeichner.getNearestSignalStartZiel(e.X, e.Y, false); kartenZeichner.setLayers("signal_start", true); this.Invalidate(); selectRouteEnd = false; } if (act.ZstartSignal != null && act.ZzielSignal != null) { act.route = fstrRouteSearchStart(act.ZstartSignal, act.ZzielSignal); } updateZugFields(); mMap.Image = kartenZeichner.draw(); return; } int movementThreshold = 3; if ((Math.Abs(deltaX) > movementThreshold) || (Math.Abs(deltaY) > movementThreshold)) { kartenZeichner.move(deltaY, deltaX); mMap.Image = kartenZeichner.draw(); } else if (!mouseMoved) { if (moduToolStripMenuItem.Checked && punkteToolStripMenuItem.Checked) { var nächsteStation = kartenZeichner.getNearestStation(e.X, e.Y); if (kartenZeichner.getStationDistance(nächsteStation, e.X, e.Y) < 10) { nächsteStation.selected = !nächsteStation.selected; mMap.Image = kartenZeichner.draw(); modListBox.SetSelected(Module.mSammlung.IndexOf(nächsteStation), nächsteStation.selected); } } } mouseMoved = false; } if (e.Button == MouseButtons.Right) //HACK: Horrible Right Click Menu { var nächsteStation = kartenZeichner.getNearestStation(e.X, e.Y); horribleHackVariableThatHoldsRightClickModule = nächsteStation; tmpSignal = kartenZeichner.getNearestSignal(e.X, e.Y); if (nächsteStation == null || tmpSignal == null) { return; } string Signame = tmpSignal.Info; //MessageBox.Show(horribleHackVariableThatHoldsRightClickSignal.Info, "Nächstes Signal:", MessageBoxButtons.OK); MenuItem[] menuItems = new MenuItem[] { new MenuItem("Pixel: X" + e.X + " - Y" + e.Y), new MenuItem("Koordinaten: X" + kartenZeichner.pixToCoord(e.X, false).ToString("F1") + " - Y" + kartenZeichner.pixToCoord(e.Y, true).ToString("F1")), new MenuItem("Nächste Station: " + nächsteStation.modName + "; Distanz: " + kartenZeichner.getStationDistance(nächsteStation, e.X, e.Y).ToString()), new MenuItem("Nächstes Signal: " + tmpSignal.Info + "-" + Signame + "; Distanz: " + (1000 * kartenZeichner.getSigDistance(tmpSignal, e.X, e.Y)).ToString("F2")), new MenuItem(nächsteStation.modName + " im Explorer anzeigen", new EventHandler(showMod)) }; ContextMenu buttonMenu = new ContextMenu(menuItems); buttonMenu.Show(mMap, new Point(e.X, e.Y)); } }
public modContainer() { var timeGesamt = new System.Diagnostics.Stopwatch(); timeGesamt.Start(); //Durchläuft das Streckenverzeichnis und sucht nach allen .st3-Dateien try { DirBase = Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Zusi3", "DatenVerzeichnis", "").ToString(); } catch (Exception) { try { DirBase = Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Zusi3", "DatenVerzeichnis", "").ToString(); } catch (Exception) { MessageBox.Show("Datenverzeichnis konnte nicht gefunden werden.", "Fataler Fehler", MessageBoxButtons.OK); Application.Exit(); } } if (DirBase[DirBase.Length - 1] != '\\') { DirBase += '\\'; } DirRoute = DirBase + "Routes\\Deutschland\\"; List <string> st3Fehler = new List <string>(); foreach (string grid in Directory.GetDirectories(DirRoute)) { foreach (string mod in Directory.GetDirectories(grid)) { foreach (string st3 in Directory.GetFiles(mod, "*.st3")) { if (!st3.Contains("ummy")) { streckenModul aktModul = modulEinlesen(st3); if (!(aktModul == null)) { mSammlung.Add(aktModul); } else { st3Fehler.Add(st3); } } } } } moduleVerlinken(); timeGesamt.Stop(); loadTime = timeGesamt.ElapsedMilliseconds; //MessageBox.Show("Einlesen hat " + timeGesamt.ElapsedMilliseconds + " ms gedauert.", "Gesamtdauer des Einlesens", MessageBoxButtons.OK); if (st3Fehler.Count > 0) { string errMsg = "Fehler beim Laden der folgenden Module:"; foreach (var st3 in st3Fehler) { errMsg += "\n - " + st3; } errMsg += "\n\nDie betroffenen Module wurden ignoriert."; MessageBox.Show(errMsg, "Fehler in .st3-Dateien", MessageBoxButtons.OK); } }
//Wandelt die als String gespeicherten Verbindungen in Pointer um. void moduleVerlinken() { //MessageBox.Show("Module werden jetzt verlinkt.", "Debugnachricht", MessageBoxButtons.OK); foreach (streckenModul aktModul in mSammlung) { aktModul.Verbindungen = new List <streckenModul>(); foreach (string connectionString in aktModul.VerbindungenStr) { streckenModul connectionObj = sucheMod(connectionString); if (!(connectionObj == null)) { aktModul.Verbindungen.Add(connectionObj); } else { aktModul.NetzGrenze = true; //aktModul.VerbindungenStr.Remove(connectionString); } } } //Delete one-sided connections. foreach (streckenModul mod in mSammlung) { foreach (var connection in mod.Verbindungen.ToArray()) { //if (! connection.Verbindungen.Contains(mod)) //{ // mod.Verbindungen.Remove(connection); //} } if (mod.Verbindungen.Count < 2) { mod.NetzGrenze = true; //if (true || mod.Verbindungen.Count != mod.VerbindungenStr.Count) //{ // string msgString = "Eingelesene Verbindungen:"; // foreach (var item in mod.VerbindungenStr) // { // msgString += "\n" + item; // } // msgString += "\nVerbliebene Verbindungen:"; // foreach (var item in mod.Verbindungen) // { // msgString += "\n" + item.modName; // } // MessageBox.Show(msgString, "Grenzreport für " + mod.modName, MessageBoxButtons.OK); //} } if ((mod.Verbindungen.Count > 2) || (mod.NetzGrenze)) { mod.wichtig = true; } //DrawDist eintragen. double dist = 0; foreach (var con in mod.Verbindungen) { double dx = mod.UTM_WE - con.UTM_WE; double dy = mod.UTM_NS - con.UTM_NS; double modDist = Math.Sqrt(dx * dx + dy * dy); if (modDist > dist) { dist = modDist; } } mod.drawDist = dist; } //string problemstellen = ""; //verlinke fahrstraßen mit referenzen. var unvollständigeFahrstraßen = new List <streckenModul.fahrStr>(); foreach (var mod in mSammlung) { foreach (var fstr in mod.FahrStr) { fstr.StartMod = mod; fstr.Start = mod.sucheReferenz(fstr.StartRef); //if (fstr.Start == null || fstr.Start.Signal == null) if (fstr.Start == null) { unvollständigeFahrstraßen.Add(fstr); continue; } else { fstr.Start.abgehendeFahrstraßen.Add(fstr); } fstr.ZielMod = sucheMod(fstr.ZielMod_Str); if (fstr.ZielMod == null) { unvollständigeFahrstraßen.Add(fstr); continue; } else { fstr.Ziel = fstr.ZielMod.sucheReferenz(fstr.ZielRef); //if (fstr.Ziel == null ||fstr.Ziel.Signal == null) if (fstr.Ziel == null) { unvollständigeFahrstraßen.Add(fstr); continue; } } } foreach (var ufstr in unvollständigeFahrstraßen) //Entfernen von unvollständigen Fahrstraßen. { mod.FahrStr.Remove(ufstr); } } //Folgestraßen eintragen foreach (var mod in mSammlung) { foreach (var fstr in mod.FahrStr) { fstr.folgeStraßen = new List <streckenModul.fahrStr>(); if (!(fstr.Ziel == null)) { foreach (var fort in fstr.ZielMod.FahrStr) { if (fstr.Ziel == fort.Start) { fstr.folgeStraßen.Add(fort); } } } } } //Sammle abgehende Fahrstraßen zu Signalen in Modul. foreach (var mod in mSammlung) { foreach (var fstr in mod.FahrStr) //Start- und Zielsignale in den entsprechenden Modulen ein. { fstr.Start.istStart = true; if (!(mod.StartSignale.Contains(fstr.Start))) { mod.StartSignale.Add(fstr.Start); } if (!(mod.StartUndZielSignale.Contains(fstr.Start))) { mod.StartUndZielSignale.Add(fstr.Start); } fstr.Ziel.istZiel = true; if (!(fstr.ZielMod.ZielSignale.Contains(fstr.Ziel))) { fstr.ZielMod.ZielSignale.Add(fstr.Ziel); } if (!(fstr.ZielMod.StartUndZielSignale.Contains(fstr.Ziel))) { fstr.ZielMod.StartUndZielSignale.Add(fstr.Ziel); } } } }