コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }