public Tarpstotis(Stotis stotis_1, Stotis stotis_2) { if (stotis_1.iki < stotis_2.nuo) { stotis1 = stotis_1; stotis2 = stotis_2; } else { stotis1 = stotis_2; stotis2 = stotis_1; } }
public static Vieta parseSuvirinimas(VietosKodas kodas) { // AA.BCCC.DD.EE.F int aa = kodas.aa; int b = kodas.b; int ccc = kodas.ccc; int dd = kodas.dd; int ee = kodas.ee; int f = kodas.f; Vieta vieta = new Vieta(); vieta.galimosLinijos = new List <Linija>(); vieta.kodas = aa.ToString("00") + "." + b.ToString() + ccc.ToString("000") + "." + dd.ToString("00") + "." + ee.ToString("00") + "." + f.ToString(); // ar linija List <Stotis> lin = null; Stotis stt = null; int dist; if (LGIF.infrastruktūra.ContainsKey(aa)) // jeigu yra tokia linija, kokia nurodyta AA { lin = LGIF.infrastruktūra[aa]; if (b == 8) { throw new InvalidKodasException(ExceptMsgs["xx.Xxxx.xx.xx.x negali būti 8"]); } vieta.galimosLinijos.Add(LGIF.linijos[aa]); if (b == 9) // jeigu iešmas { if (f != 0) { throw new InvalidKodasException(ExceptMsgs["xx.xxxx.xx.xx.X turi būti 0"]); } // ieškoma mažos stoties, kurios ribose būtų ccc nurodytas kilometras { int cccPradzia = (ccc - 1) * 1000; // ccc kilometro pradžia int cccPabaiga = cccPradzia + 1000; // ccc kilometro pabaiga stt = lin.Find(delegate(Stotis stotis) { return(!((stotis.iki == -1 ? true : stotis.iki <= cccPradzia) || stotis.nuo >= cccPabaiga)); }); } if (stt == null) { throw new InvalidKodasException(ExceptMsgs["xx.xXXX.xx.xx.x netinka mažai stočiai"]); } vieta.stotis = stt; if (dd < 1 || dd > 8) { throw new InvalidKodasException(ExceptMsgs["xx.xxxx.XX.xx.x gali būti nuo 1 iki 8"]); } if (ee < 1 || ee > MAX_SANDURU_IESME) { throw new InvalidKodasException(string.Format(ExceptMsgs["xx.xxxx.xx.XX.x gali būti nuo 1 iki MAX_SANDŪRŲ"], MAX_SANDURU_IESME)); } // suvirinimas mažos stoties iešme - baigta vieta.stotis = stt; vieta.koordinatė = new KelioKoordinatė(ccc); vieta.kelioElementas = new KelioElementas(KelioElementoTipas.iešmas, dd); vieta.iešmoSandūra = new Sandūra(ee); return(vieta); } else // jeigu ne iešmas { if (dd < 1 || dd > 10) { throw new InvalidKodasException(ExceptMsgs["xx.xxxx.XX.xx.x gali būti nuo 1 iki 10"]); } if ((b != 6 && b != 7) && (f != 0 && f != 9)) { throw new InvalidKodasException(ExceptMsgs["Mažoje stotyje netrumpajame kelyje xx.xxxx.xx.xx.X gali būti 0 arba 9"]); } if ((b == 6 || b == 7) && (f == 0 || f == 9)) { throw new InvalidKodasException(ExceptMsgs["Mažoje stotyje trumpajame kelyje xx.xxxx.xx.xx.X gali būti 1-8"]); } vieta.koordinatė = new KelioKoordinatė(ccc, dd, ee); // ar ccc.dd.ee tinka mažai stočiai dist = (ccc - 1) * 1000 + (dd - 1) * 100 + ee; stt = lin.Find(delegate(Stotis stotis) { return((stotis.nuo == -1 ? false : dist >= stotis.nuo) && dist <= stotis.iki); }); if (stt != null) // ccc.ee.dd mažai stočiai tinka { vieta.stotis = stt; switch (b) { case 1: case 2: case 3: case 4: case 5: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.stoties_kelias, b); vieta.siūlė = new Siūlė(f); break; case 6: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.trumpasis_kelias_nuo_iešmo_kairėn, f); break; case 7: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.trumpasis_kelias_nuo_iešmo_dešinėn, f); break; } return(vieta); } else // ccc.dd.ee mažai stočiai netinka { if (b != 1 && b != 2) { throw new InvalidKodasException(ExceptMsgs["xx.Xxxx.xx.xx.x gali būti 1 arba 2"]); } // rasti tarpstotį { Stotis stotis1 = lin.FindLast(delegate(Stotis stotis) { return(stotis.iki == -1 ? false : dist > stotis.iki); }); Stotis stotis2 = lin.Find(delegate(Stotis stotis) { return(dist < stotis.nuo); }); if (stotis1 == null || stotis2 == null) { throw new InvalidKodasException(ExceptMsgs["xx.xXXX.XX.XX.x netinka linijai"]); } vieta.tarpstotis = new Tarpstotis(stotis1, stotis2); } vieta.siūlė = new Siūlė(f); switch (b) { case 1: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.tarpstočio_nelyginis_kelias, b); break; case 2: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.tarpstočio_lyginis_kelias, b); break; } return(vieta); } } } else // jeigu tokios linijos nėra { List <Stotis> galimosStotys = new List <Stotis>(); // ieškoma stoties aa; foreach (List <Stotis> linijosStotys in LGIF.infrastruktūra.Values) { stt = linijosStotys.Find(delegate(Stotis stotis) { return(stotis.kodas == aa); }); if (stt != null) { galimosStotys.Add(stt); } } if (galimosStotys.Count == 0) { throw new InvalidKodasException(ExceptMsgs["Tokios stoties nėra"]); } if (b == 9) { throw new InvalidKodasException(ExceptMsgs["DS b negali būti 9"]); } if (b == 8) { if (dd != 0 || f != 0) { throw new InvalidKodasException(ExceptMsgs["Kai suvirinimas DSI, xx.xxxx.XX.xx.X turi būti 0."]); } if (ee < 1 || ee > MAX_SANDURU_IESME) { throw new InvalidKodasException(string.Format(ExceptMsgs["DSI xx.xxxx.xx.XX.x gali būti nuo 1 iki {0}."], MAX_SANDURU_IESME)); } foreach (Stotis st in galimosStotys) { vieta.galimosLinijos.Add(st.linija); } vieta.stotis = stt; // įdedama paskutinė rastoji vieta.kelioElementas = new KelioElementas(KelioElementoTipas.iešmas, ccc); vieta.iešmoSandūra = new Sandūra(ee); return(vieta); } if (f != 0 && f != 9) { throw new InvalidKodasException(ExceptMsgs["xx.xxxx.xx.xx.X gali būti 0 arba 9"]); } if (b == 1) { if (dd == 0) { throw new InvalidKodasException(ExceptMsgs["xx.xxxx.XX.xx.x gali būti nuo 1 iki 10"]); } // tikrinti, ar koordinate ccc.dd.ee tinka didelei stočiai aa dist = (ccc - 1) * 1000 + (dd - 1) * 100 + ee; stt = null; stt = galimosStotys.Find(delegate(Stotis stotis) { return((stotis.nuo == -1 ? false : stotis.nuo <= dist) && (stotis.iki >= dist)); }); if (stt == null) { throw new InvalidKodasException(ExceptMsgs["xx.xXXX.XX.XX.x netinka stočiai"]); } vieta.galimosLinijos.Add(stt.linija); vieta.stotis = stt; vieta.kelioElementas = new KelioElementas(KelioElementoTipas.stoties_pagrindinis_kelias); vieta.koordinatė = new KelioKoordinatė(ccc, dd, ee); vieta.siūlė = new Siūlė(f); return(vieta); } foreach (Stotis st in galimosStotys) { vieta.galimosLinijos.Add(st.linija); } vieta.stotis = stt; // įdedama paskutinė rastoji vieta.atstumasNuoIešmo = new Atstumas(dd * 100 + ee); vieta.siūlė = new Siūlė(f); switch (b) { case 2: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.stoties_pagrindinis_kelias, ccc); break; case 3: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.atvykimo_išvykimo_kelias, ccc); break; case 4: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.stoties_kelias, ccc); break; case 5: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.sankirta, ccc); break; case 6: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.trumpasis_kelias_nuo_iešmo_kairėn, ccc); break; case 7: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.trumpasis_kelias_nuo_iešmo_dešinėn, ccc); break; } return(vieta); } }
public static Vieta parseDefektas(VietosKodas kodas) { // AA.BCCC.DD.EE.F int aa = kodas.aa; int b = kodas.b; int ccc = kodas.ccc; int dd = kodas.dd; int ee = kodas.ee; int f = kodas.f; Vieta vieta = new Vieta(); vieta.galimosLinijos = new List <Linija>(); vieta.kodas = aa.ToString("00") + "." + b.ToString() + ccc.ToString("000") + "." + dd.ToString("00") + "." + ee.ToString("00") + "." + f.ToString(); // ar linija List <Stotis> lin = null; Stotis stt = null; int dist; if (LGIF.infrastruktūra.ContainsKey(aa)) // jeigu yra tokia linija, kokia nurodyta AA { if (dd > 10 || dd < 1) { throw new InvalidKodasException(ExceptMsgs["dd_nuo_1_iki_10"]); } lin = LGIF.infrastruktūra[aa]; vieta.galimosLinijos.Add(LGIF.linijos[aa]); // tikrinti, ar kode nurodyta kelio koordinate linijai tinka dist = (ccc - 1) * 1000 + (dd - 1) * 100 + ee; int start, end; start = lin.First().nuo != -1 ? lin.First().nuo : lin.First().iki; end = lin.Last().iki != -1 ? lin.Last().iki : lin.Last().nuo; if (dist < start || dist > end) { throw new InvalidKodasException(ExceptMsgs["Koordinatė_netinka_linijai"]); } // tikrinti, ar nurodyta kelio koordinatė nėra didelėje stotyje (nes tada AA vietoje turėtų būti didelės stoties kodas) foreach (Stotis st in lin) { if (st.kodas != 0 && st.nuo != -1 && st.iki != -1) { if (dist >= st.nuo && dist <= st.iki) { throw new InvalidKodasException(string.Format(ExceptMsgs["Koordinatė_tinka_stočiai"], st.pavadinimas, st.kodas)); } } } // ieškoti - stoties arba tarpstočio for (int i = 0; i < lin.Count; i++) { if (dist >= lin[i].nuo && dist <= lin[i].iki) // maža stotis { vieta.stotis = lin[i]; switch (b) { case 1: case 2: case 3: case 4: case 5: if (f != 0 && f != 9) { throw new InvalidKodasException(ExceptMsgs["Siūlė_0_arba_9"]); } vieta.kelioElementas = new KelioElementas(KelioElementoTipas.stoties_kelias, b); vieta.siūlė = new Siūlė(f); break; case 6: if (f == 0 || f == 9) { throw new InvalidKodasException(ExceptMsgs["Mažos_iešmas_ne_0_ne_9"]); } vieta.kelioElementas = new KelioElementas(KelioElementoTipas.trumpasis_kelias_nuo_iešmo_kairėn, f); break; case 7: if (f == 0 || f == 9) { throw new InvalidKodasException(ExceptMsgs["Mažos_iešmas_ne_0_ne_9"]); } vieta.kelioElementas = new KelioElementas(KelioElementoTipas.trumpasis_kelias_nuo_iešmo_dešinėn, f); break; case 8: case 9: if (f == 0 || f == 9) { throw new InvalidKodasException(ExceptMsgs["Mažos_iešmas_ne_0_ne_9"]); } vieta.kelioElementas = new KelioElementas(KelioElementoTipas.iešmas, f); break; } vieta.koordinatė = new KelioKoordinatė(ccc, dd, ee); break; } else if (dist < lin[i + 1].nuo) { vieta.tarpstotis = new Tarpstotis(lin[i], lin[i + 1]); if (f != 0 && f != 9) { throw new InvalidKodasException(ExceptMsgs["Siūlė_0_arba_9"]); } switch (b) { case 1: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.tarpstočio_nelyginis_kelias, b); // Čia - klausimas. Formaliai šnekant, b nuorodo tik, kelias lyginis, ar nelyginis, bet nieko nesako apie jo numerį // Žinoma, galima tikėtis, kad nelyginio kelio numeris bus 1, o lyginio - 2. Bet ar yra tokia taisyklė, tai nežinau. break; case 2: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.tarpstočio_lyginis_kelias, b); break; default: // b t.b. 1 arba 2 throw new InvalidKodasException(ExceptMsgs["Tarpstočio_kelias_1_arba_2"]); } vieta.koordinatė = new KelioKoordinatė(ccc, dd, ee); vieta.siūlė = new Siūlė(f); break; } } } else // ieško didelės stoties { if (b == 1) // jeigu nurodyta kelio koordinatė, ta pati stotis (tas pats AA) gali būti keliose skirtingose linijose. // Todėl reikia rasti tą liniją, kurioje tai stočiai tinka kelio koordinatė, nurodyta BBB.CC.DD { if (dd > 10 || dd < 1) { throw new InvalidKodasException(ExceptMsgs["dd_nuo_1_iki_10"]); } dist = (ccc - 1) * 1000 + (dd - 1) * 100 + ee; foreach (List <Stotis> ln in LGIF.infrastruktūra.Values) { stt = ln.Find(delegate(Stotis stotis) { return(stotis.kodas == aa && dist <= stotis.iki && dist >= stotis.nuo); }); if (stt != null) { vieta.galimosLinijos.Add(stt.linija); vieta.stotis = stt; } } if (vieta.stotis == null) { throw new InvalidKodasException(ExceptMsgs["Nėra_stoties_su_koordinate"]); } } else // jeigu kelio koordinatė nenurodyta, užtenka rasti didelę stotį. // Čia - nevienareikšmiškumas. Kode nesimato, kokiai linijai priklauso konkretus iešmas ar stoties kelias { List <Stotis> rastosStotys = new List <Stotis>(); foreach (List <Stotis> ln in LGIF.infrastruktūra.Values) { stt = ln.Find(delegate(Stotis stotis) { return(stotis.kodas == aa); }); if (stt != null) { rastosStotys.Add(stt); vieta.galimosLinijos.Add(stt.linija); } } if (rastosStotys.Count == 0) { throw new InvalidKodasException(ExceptMsgs["Nėra_tokios_linijos_stoties"]); } else { vieta.stotis = rastosStotys[0]; } } if (f != 0 && f != 9) { throw new InvalidKodasException(ExceptMsgs["Siūlė_0_arba_9"]); } else { vieta.siūlė = new Siūlė(f); } switch (b) { case 1: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.stoties_pagrindinis_kelias, b); vieta.koordinatė = new KelioKoordinatė(ccc, dd, ee); break; case 2: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.stoties_pagrindinis_kelias, ccc); vieta.atstumasNuoIešmo = new Atstumas(dd * 100 + ee); break; case 3: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.atvykimo_išvykimo_kelias, ccc); vieta.atstumasNuoIešmo = new Atstumas(dd * 100 + ee); break; case 4: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.stoties_kelias, ccc); vieta.atstumasNuoIešmo = new Atstumas(dd * 100 + ee); break; case 5: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.sankirta, ccc); vieta.atstumasNuoIešmo = new Atstumas(dd * 100 + ee); break; case 6: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.trumpasis_kelias_nuo_iešmo_kairėn, ccc); vieta.atstumasNuoIešmo = new Atstumas(dd * 100 + ee); break; case 7: vieta.kelioElementas = new KelioElementas(KelioElementoTipas.trumpasis_kelias_nuo_iešmo_dešinėn, ccc); vieta.atstumasNuoIešmo = new Atstumas(dd * 100 + ee); break; case 8: case 9: if (dd != 0 || ee != 0) { throw new InvalidKodasException(ExceptMsgs["Atstumas_nuo_iešmo_iešme"]); } vieta.kelioElementas = new KelioElementas(KelioElementoTipas.iešmas, ccc); vieta.atstumasNuoIešmo = new Atstumas(0); break; } } return(vieta); }