/// <summary> /// Tworzy geometrię odpowiadającą rekordowi przestrzennemu, zwraca null jeżeli rekord jest nieprzestrzenny. /// </summary> internal static GeometriaSwde createGeometryOrNull(DokumentSwde dokument, RekordSwdeBase rekord) { GeometriaSwde geometria = null; if (rekord is RekordPunktowySwde) { RekordPunktowySwde rekordPunktowy = rekord as RekordPunktowySwde; geometria = new PunktSwde(rekordPunktowy, dokument.Geodezyjny); geometria._punktyGraniczne = GetPunktyGraniczne(dokument, rekordPunktowy, out geometria._punktyNiegraniczne); } else if (rekord is RekordLiniowySwde) //Liniowym elementem jest tylko granica. { RekordLiniowySwde rekordLiniowy = rekord as RekordLiniowySwde; geometria = new MultiLiniaSwde(rekordLiniowy, dokument.Geodezyjny); geometria._punktyGraniczne = GetPunktyGraniczne(dokument, rekordLiniowy, out geometria._punktyNiegraniczne); } else if (rekord is RekordObszarowySwde) { RekordObszarowySwde rekordObszarowy = rekord as RekordObszarowySwde; geometria = new MultiObszarSwde(rekordObszarowy, dokument.Geodezyjny); geometria._punktyGraniczne = GetPunktyGraniczne(dokument, rekordObszarowy, out geometria._punktyNiegraniczne); } return(geometria); }
private static ObiektSwde[] GetPunktyGraniczne(DokumentSwde dokument, RekordLiniowySwde rekordLiniowy, out int punktyNiegraniczne) { List <ObiektSwde> punktyGraniczne = new List <ObiektSwde>(); HashSet <RekordId> rekordyDodane = new HashSet <RekordId>(); punktyNiegraniczne = 0; foreach (var linia in rekordLiniowy.Linie) { foreach (var pozycja in linia.Segmenty) { if (pozycja is PozycjaIdSwde || pozycja is PozycjaIdrSwde) { RekordSwdeBase rekord = pozycja.Rekord; if (rekordyDodane.Add(rekord.Identyfikator)) { punktyGraniczne.Add(dokument.createObiekt(rekord)); } } else { punktyNiegraniczne++; } } } return(punktyGraniczne.ToArray()); }
internal ObiektSwde(DokumentSwde dokument, RekordSwdeBase rekord) { _dokument = dokument; _rekord = rekord; //_geometria = GeometriaSwde.createGeometryOrNull(dokument, rekord); _id = new ObiektId(_rekord.Identyfikator); }
/// <summary> /// Zwraca obiekt odpowiadający danemu rekordowi, jeżeli taki obiekt jeszcze nie istnieje to zostanie utworzony. /// </summary> /// <param name="rekord"></param> /// <returns></returns> internal ObiektSwde createObiekt(RekordSwdeBase rekord) { if (_obiekty.ContainsKey(rekord.Identyfikator)) { return(_obiekty[rekord.Identyfikator]); } ObiektSwde obiekt = new ObiektSwde(this, rekord); _obiekty.Add(rekord.Identyfikator, obiekt); return(obiekt); }
private bool ZapewnijUnikatowyIdr(RekordSwdeBase rekord) { string idr = rekord.Idr; bool powtorzonyIdr = _rekordy.ContainsKey(idr); //KontrolerKontekstu.Zapewnij(!powtorzonyIdr, string.Format("Identyfikator rekordu musi być unikatowy <{0}>.", idr)); if (powtorzonyIdr) { LoggerSwde.PowtorzonyIdentyfikatorRekordu(rekord); } return(!powtorzonyIdr); }
/// <summary> /// Dodaj nowy rekord do tabeli. Indeks tabel jest budowany automatycznie na podstawie typu rekordu. /// </summary> /// <param name="rekord"></param> public bool DodajRekord(RekordSwdeBase rekord) { string typ = RekordSwdeG5.NormalizujPrefiksTypu(rekord.Typ); if (!_tabele.ContainsKey(typ)) { _tabele.Add(typ, new TabelaSwde(typ)); } //Mogą być różne wersje obiektu o tym samym id. TabelaSwde tabelaTypu = _tabele[typ]; return(tabelaTypu.DodajObiekt(rekord)); }
/// <summary> /// Wyszukuje poprzednią wersję obiektu. /// </summary> /// <returns>Poprzednia wersja obiektu lub <code>null</code> jeżeli brak poprzedniej wersji.</returns> internal IEnumerable <ObiektSwde> GetWersjeObiektu(RekordSwdeBase rekord) { SekcjaObiektowSwde obiekty = _dokument.Obiekty; KolekcjaWersji wersjeRekordu = obiekty.SzukajWersji(rekord.Typ, rekord.Id); List <ObiektSwde> wersjeObiektu = new List <ObiektSwde>(); //UWAGA: dostęp do daty wymaga znajomości modelu G5 (to jest wyższy poziom abstrakcji). foreach (RekordSwdeBase wersjaRekordu in wersjeRekordu) { wersjeObiektu.Add(createObiekt(wersjaRekordu)); } return(wersjeObiektu); }
/// <summary> /// Dodaj nowy rekord do indeksu. Może być tylko jeden rekord o podanym idr. /// Rekordy z pustym idr nie są dodawane do indeksu. /// </summary> /// <remarks> /// W pliku SWDE mogą pojawić się rekordy o tym samym idr, ten typ błędu jest niedopuszczalny. /// </remarks> /// <param name="rekord"></param> /// <exception cref="System.InvalidOperationException">Jeżeli identyfikator zostanie powtórzony.</exception> public bool Dodaj(RekordSwdeBase rekord) { string idr = rekord.Idr; if (string.IsNullOrEmpty(rekord.Idr)) { return(true); } if (!ZapewnijUnikatowyIdr(rekord)) { return(false); } _rekordy.Add(rekord.Idr, rekord); return(true); }
/// <summary> /// Zwraca obiekty będące w danej relacji z tym obiektem. /// </summary> /// <param name="nazwa">Nazwa/kod relacji (bez prefiksu).</param> public IEnumerable <ObiektSwde> GetRelacjaWielokrotna(string nazwa) { nazwa = RekordSwdeG5.NormalizujPrefiksAtrybutu(nazwa); IEnumerable <WiazanieSwdeBase> wiazania = _rekord.Wiazania.Where(r => r.Pole == nazwa); List <ObiektSwde> obiekty = new List <ObiektSwde>(); foreach (WiazanieSwdeBase wiazanie in wiazania) { RekordSwdeBase rekord = wiazanie.Rekord; //Obiekt odpowiadający rekordowi powinien już istnieć i dokument powinien posiadać instancję tego obiektu. obiekty.Add(_dokument.createObiekt(rekord)); } return(obiekty); }
/// <summary> /// Dodaj obiekt do tabeli (może być nowa wersja). /// </summary> /// <param name="rekord"></param> public bool DodajObiekt(RekordSwdeBase rekord) { string id = rekord.Id; if (!_wersje.ContainsKey(id)) { _wersje.Add(id, new KolekcjaWersji(id)); } if (!_wersje[id].DodajWersje(rekord)) { return(false); } _obiekty.Add(rekord); return(true); }
internal static void PowtorzonaAktualnaWersjaObiektu(RekordSwdeBase rekord) { error(string.Format("{0} <ID:{1},IDR:{2}>: Powtórzona aktualna wersja obiektu SWDE (ID). Rekord został pominięty.", rekord.Typ, rekord.Id, rekord.Idr)); }
internal static void PowtorzonyIdentyfikatorRekordu(RekordSwdeBase rekord) { error(string.Format("{0} <ID:{1},IDR:{2}>: Powtórzony identyfikator rekordu SWDE (IDR). Rekord został pominięty.", rekord.Typ, rekord.Id, rekord.Idr)); }