Klasa/BinItem

Z Rainsted
Skocz do: nawigacji, wyszukiwania

Jest to podstawowa struktura, na której bazują rekordy wszystkich obiektów. Zawiera nagłówek długości 20 bajtów oraz metody zarządzania rekordami.

Od wersji 13. pliku (Rainsted 1.0.99.8966) zamienione zostały miejscami pola Len oraz Flags. Rainsted automatycznie modyfikuje plik RSF i zapisuje w aktualnej wersji.

Kod klasy

class BinManager;
class BinRecord;

class BinItem
{//ogólnie obiekt w rekordzie - długość 0x14
friend class BinManager;
//zmienne:
protected:
 static BinManager *Manager;
public:
 BinByte Len; //ilość rekordów na obiekt, zero w kolejnych
 BinByte Flags; //flagi rekordu: b0,b1=grupa,b6=1-Id jest kilometrażem
 union
 {//struktura dla typu rekordu
  BinWord Type; //rodzaj rekordu
  struct
  {BinByte TypeLo;
   BinByte TypeHi; //aby łatwiej porównywać
  };
 };
 BinPtr Path; //wskażnik na rekord właściciela
 int Id; //identyfikator w ramach listy; indeks kilometrażu [mm]
 BinPtr Prev,Next; //wskaźnik na następny i poprzedni
//metody dla konkretnego obiektu:
 void __fastcall Disconnect(int what=-1);
 bool __fastcall Join(int where,BinRecord *r,BinPtr what=0);
 bool __fastcall Join(int where,BinPtr what);
 BinRecord* __fastcall RecordPrev();
 BinRecord* __fastcall RecordNext();
 BinRecord* __fastcall Neighbour(bool &dir);
 BinRecord* __fastcall RecordPrev(BinWord t,BinWord m=0xFFFF);
 BinRecord* __fastcall RecordNext(BinWord t,BinWord m=0xFFFF);
 BinRecord* __fastcall RecordAddress(BinPtr p); //bezwzględny adres rekordu
 BinPtr __fastcall RecordRelative(); //adres względny
 void __fastcall GroupSet(int g); //ustawienie przydziału grupy
 int __fastcall GroupGet(); //odczyt przydziału grupy
 void __fastcall Clear(); //zerowanie zawartości
 int __fastcall FileType(int p=0);
//metody działające na wszystkich rekordach:
 BinRecord* __fastcall RecordZero(); //rekord zerowy
 bool __fastcall Sort(BinRecord *r); //sortowanie
 int __fastcall Count(); //ilość rekordów
 void __fastcall SizeCheck(TRect *r=NULL);
};
BinManager* BinItem::manager=NULL;

Opis klasy

Obiekt manager klasy BinManager odpowiada za wczytanie, zapis i obsługę pliku RSF umieszczonego w pamięci (w tym dodawanie nowych rekordów). Ze względu na sposób jego podłączenia do klasy obiektu scenerii, nie jest możliwe jednoczesne korzystanie z dwóch plików RSF (a przynajmniej wymaga to zmiany wskaźnika na obiekt zarządzający).

Klasa BinRecord pozwala na dostęp do różnych typów obiektów, gdy mamy zwykły wskaźnik do obiektu, zwykle używana w postaci wskaźnika BinRecord*. Ze względu na zapis obiektów w postaci tabeli BinRecord[] nie jest możliwe użycie funkcji wirtualnych.

Zmienne

Zmienna Len informuje o ilości rekordów zajmowanych przez dany obiekt. Jeśli obiekt zajmuje tylko jeden rekord, ma ona wartość 1. Jeśli obiekt zajmuje dwa rekordy, to w pierwszym z nich jest wartość 2, a w drugim 0. Podobnie przy większej ilości rekordów, pierwszy będzie zawierał ilość, a w kolejnych będzie 0.

Zmienna Flags służy do zapisu ogólnych informacji o obiekcie. Bity 0..4 do zapamiętania przydziału obiektu do grupy (wartości: 0-poza grupą, 1-ogranicznik rozlania grupy, 2-w grupie, pozostałe nie są używane w edytorze, ale mogą być w serwerze ruchu: zajętość, utwierdzenie, zamknięcie indywidualne/grupowe). Ustawiony bit 6 zwiększa priorytet zmiennej Id. Bit 7 jest zarezerwowany.

Zmienne Type, TypeLo, TypeHi określają typ obiektu. Unia jest użyta głównie w celu uproszczenia operacji sprawdzania typu obiektu.

Wskaźnik Path wskazuje na obiekt nadrzędny do danego, np. dla torów nadrzędne są niwelety, dla niwelet przekroje poprzeczne, a dla przekrojów również niwelety. Dla semaforów i słupów nadrzędne są tory, a dla budynków mogą być to również niwelety.

Zmienna Id na ogół określa pozycję (indeks kilometrażu) obiektu na niwelecie. Jeśli bit 6 w zmiennej Flags został ustawiony, podana wartość Id jest ważniejsza niż wartość uzyskana z wyliczenia aktualnego rzutu prostopadłego obiektu na niweletę. Wartość ujemna Id oznacza na ogół obrócenie obiektu o 180° wokół osi pionowej (obiekt jest wtedy tyłem do wzrostu kilometrażu).

Wskaźniki Prev oraz Next wskazują na sąsiednie obiekty tego samego typu, umieszczone na liście dwukierunkowej. Służą one między innymi do logicznego łączenia torów, w przypadku obiektu słupa istnienie Next jest równoznaczne z połączeniem słupów drutem.

Metody

Disconnect(), Join() służą do rozłączania i logicznego łączenia obiektów.

RecordPrev(), RecordNext(), Neighbour() służą do uzyskania wskaźników na sąsiednie rekordy, przy czym ostatnia umożliwia przesuwanie się po kolejnych odcinkach w konkretną stronę, zależnie od początkowej wartości zmiennej.

Metoda Sort() wstawia obiekt na odpowiednie miejsce do listy dwukierunkowej (np. służy do sortowania przekrojów poprzecznych oraz listy plików).

Metoda RecordAddress() zamienia podany wskaźnik względny typu BinPtr na bezwzględny BinRecord*, a metoda RecordRelative() zwraca wskaźnik względny aktualnego obiektu.

Metoda RecordZero() zwraca adres na rekord zerowy pliku (ze specyficznymi informacjami).

Metody GroupSet() i GroupGet() używane są do operacji na grupach obiektów.

Metoda Count() zwraca ilość obiektów w pliku (do ostatniego używanego, pomijając rezerwę), metoda Clear() usuwa obiekt bez uwzględniania powiązań z innymi obiektami. SizeCheck() oblicza rozmiary scenerii i zapisuje je do zerowego rekordu, co ma służyć ustawieniu pasków przewijania w oknie edycyjnym przy następnym wczytaniu.

Metoda FileType() służy do określania rodzaju plików powiązanych z obiektem. Na przykład dla toru będą to dwie tekstury (szyn i podsypki), dla semafora pierwszy będzie plik INC itd. Wartości są pobierane z wbudowanej tabeli własności typów, na podstawie zawartości pola Type.

Klasy dziedziczące

Klasy powiązane