コード例 #1
0
        /// <summary>
        /// Rozbijamy plik z przekrojami na pojedyncze pliki (tylko obiekty typu Przekrój)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void importujPrzekrojeMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();

            dialog.Filter = "Plik z przekrojami (*.txt)|*.txt";
            dialog.Title  = "Wybiersz plik zestawień przekroi";

            if (dialog.ShowDialog(this) != DialogResult.OK)
            {
                return;
            }

            StreamReader reader = new StreamReader(dialog.FileName, Encoding.GetEncoding(1250));
            string       wiersz = null;

            //(00) Lp. np. 2
            //(01) Nazwa cieku np. Pasłęka
            //(02) Numer obiekt
            //(03) Numer przekroju i punktu pomiarowego np. 240.02
            //(04) Typ obiektu np. Przekrój
            //(05) Kod punktu np. 1
            //(06) Kod formy pokrycia terenu np. T01
            //(07) Kilometraż
            //(08) Współrzędna X np. 640648.68
            //(09) Współrzędna Y np. 587563.95
            //(10) Z rzędna [m n.p.m.] np. 147.89
            //(11) Rzędna zw. Wody
            //(12) H - wysokość progu przelewowego [m]
            //(13) α - kąt skrzyżowania głównej osi mostu z osią cieku
            //(14) Data pomiaru np. 7-02-2012
            //(15) Numer fotografii np. 243a.jpg; 243b.jpg
            //(16) Administrator obiektu

            Dictionary <string, List <Pikieta> > przekroje = new Dictionary <string, List <Pikieta> >();
            Dictionary <string, int>             obiekty   = new Dictionary <string, int>();
            Dictionary <string, AtrybutySzkicu>  atrybuty  = new Dictionary <string, AtrybutySzkicu>();

            //00 Nazwa
            //01 Nr_obiekt
            //02 Typ_obiekt
            //03 Nr_pkt
            //04 X
            //05 Y
            //06 Z
            //07 M
            //08 Kod_pikiet
            //09 Kod_pokr
            //10 Rzedna_ZW
            //11 Data
            //12 Foto
            //13 Szer_mostu
            //14 H_progu
            //15 Admin
            //16 Uwagi

            while ((wiersz = reader.ReadLine()) != null)
            {
                string[] cols = wiersz.Split('\t'); //Kolumny powinny być rozdzielone tabulacjami

                if (cols.Length < 15)
                {
                    continue;                   //Za mało kolumn w wierszu
                }
                string nazwaCieku     = cols[Settings.Default.NazwaCieku];
                string numerObiekt    = cols[Settings.Default.NumerObiekt];
                string numerPrzekroju = cols[Settings.Default.NumerPunktu];                //nazwa pliku, numer punktu
                string typObiektu     = cols[Settings.Default.TypObiekt].Trim().ToLower(); //powinien być typu Przekrój
                string kodPunktu      = cols[Settings.Default.KodPikiety];                 //kod punktu powinien być prawidłowy
                string kodFormy       = cols[Settings.Default.KodPokrycia];                //kod formy powinien być prawidłowy
                string wspX           = cols[Settings.Default.WspX];
                string wspY           = cols[Settings.Default.WspY];
                string wspZ           = cols[Settings.Default.WspZ];
                string dataPomiaru    = cols[Settings.Default.DataPomiaru];
                string zdjecia        = cols[Settings.Default.Foto].Replace("\"", "").Trim(); //numery zdjęć powinny być zgodne
                //string administrator = cols[16];

                string przekroj = numerPrzekroju.Split('.')[0]; //parse np. 240.02

                if (numerPrzekroju.EndsWith(".01"))
                {
                    if (!obiekty.ContainsKey(typObiektu))
                    {
                        obiekty.Add(typObiektu, 0);
                    }

                    obiekty[typObiektu]++;

                    if (!atrybuty.ContainsKey(przekroj))
                    {
                        AtrybutySzkicu atrybutySzkicu = new AtrybutySzkicu();
                        atrybuty.Add(przekroj, atrybutySzkicu);

                        atrybutySzkicu.Numer        = przekroj;
                        atrybutySzkicu.NazwaCieku   = nazwaCieku;
                        atrybutySzkicu.NumerObiektu = numerObiekt;
                        atrybutySzkicu.DataSzkicu   = dataPomiaru;

                        if (!string.IsNullOrEmpty(zdjecia))
                        {
                            string[] fotografie = zdjecia.Split(';');

                            for (int i = 0; i < fotografie.Length; i++)
                            {
                                fotografie[i] = fotografie[i].Split('.')[0].Trim();
                            }

                            atrybutySzkicu.Fotografie = fotografie;
                        }
                        else
                        {
                            atrybutySzkicu.Fotografie = new string[0];
                        }
                    }
                }

                if (typObiektu != "przekrój")
                {
                    continue;                           //pomijamy obiekty inne niż przekroje
                }
                //Zakładamy nową liste punktów przekroju, jeżeli jeszcze nie została utworzona
                if (!przekroje.ContainsKey(przekroj))
                {
                    przekroje.Add(przekroj, new List <Pikieta>());
                }

                Pikieta pikieta = new Pikieta(numerPrzekroju, kodFormy, double.Parse(wspX), double.Parse(wspY));
                pikieta.Rzedna = double.Parse(wspZ);
                przekroje[przekroj].Add(pikieta);
            }

            reader.Close();

            foreach (KeyValuePair <string, List <Pikieta> > kv in przekroje)
            {
                string         numer          = kv.Key;
                string         numerPrzekroju = numer;
                string         przekrojPlik   = Path.Combine(Path.GetDirectoryName(dialog.FileName), numerPrzekroju + ".xml");
                AtrybutySzkicu atrybutySzkicu = atrybuty[numer];
                List <Pikieta> punkty         = kv.Value;

                Szkic szkic = new Szkic(atrybutySzkicu.NazwaCieku, numerPrzekroju);
                szkic.DataPomiaru  = atrybutySzkicu.DataSzkicu;
                szkic.NumerObiektu = atrybutySzkicu.NumerObiektu;
                szkic.NowaGranica(_granica);
                szkic.Pikiety = punkty;
                szkic.ZbudujSzkielet(); //skalowanie tylko przy imporcie

                foreach (string foto in atrybutySzkicu.Fotografie)
                {
                    Fotografia fotografia = new Fotografia(foto);
                    szkic.DodajFotografia(fotografia);
                }

                szkic.ToXML(przekrojPlik);
            }

            string msg = "";

            foreach (KeyValuePair <string, int> kv in obiekty)
            {
                msg += string.Format("\n{0}: {1} {2}", kv.Key, kv.Value,
                                     kv.Key == "przekrój" ? "(" + przekroje.Count + " zapisane)" : "");
            }

            MessageBox.Show(this,
                            string.Format("Zestawienie obiektów w pliku\n{0}\n", msg),
                            "Import przekroi...",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
        }