Symulator EU07 (i nie tylko) > Poradniki

 [INNE] Ekran komputera pokładowego w pythonie

<< < (5/7) > >>

youBy:
Zapisywanie i wczytywanie przebiegu pojazdu z komputerem
Istnieje możliwość, aby przy uruchomieniu pojazdu stan licznika kilometrów pokrywał się* z tym, jaki był przy wyłączaniu symulacji i przez były zliczane kilometr przejechane przez użytkownika.

1. W funkcji __init__ należy zapisać

--- Kod: --- # przeniesienie ścieżki do funkcji zapisującej
self.lookup_path = lookup_path
# zapisywanie ostatniej sekundy od liczenia przebiegu
self.last_time_update = 0
# losowanie przebiegustartowego
self.kilometry = PS+(random()*PL)+(1+self.rok-RokProd)*PR+self.dzis*PD
# ostatni zapisany przebieg
self.kilometry_z = 0
# otwieranie pliku
plik = open(lookup_path + "tacho.txt")
try:
tempkm = plik.read()
if tempkm == "":
tempkm = "x"
else:
self.kilometry = float(tempkm)
self.kilometry_z = self.kilometry
finally:
plik.close()
--- Koniec kodu ---
Gdzie zastosowano zmienne czasu:

--- Kod: --- self.dzis = datetime.now().timetuple().tm_yday
self.rok = datetime.now().year
--- Koniec kodu ---
przy losowaniu przebiegu zastosowane są również parametry:
PS – stały przebieg początkowy (ewentualnie w pierwszym roku kalendarzowym),
PL – losowana wartość przebiegu pojazdu,
RokProd – rok produkcji pojazdu,
PR – przebieg roczny,
PD – przebieg dzienny.
W ich miejsce należy wpisać po prostu wybrane liczby.

2. W funkcji _render należy dodać funkcję liczącą przebieg:

--- Kod: --- #liczenie przebiegu co sekundę
if state['seconds'] != self.last_time_update:
dt = state['seconds'] - self.last_time_update
if dt < 0:
dt+=60
self.kilometry += dt*speed * 0.0002778
self.last_time_update = state['seconds']
--- Koniec kodu ---
gdzie zastosowano zmienną:

--- Kod: --- speed = float(state['velocity'])
--- Koniec kodu ---

3. W funkcji _render (pod koniec) należy dodać funkcję zapisującą:

--- Kod: --- #zapis stanu licznika do pliku
if self.kilometry>(self.kilometry_z + (0.1+0.005*speed)):
plik = open(self.lookup_path + "tacho.txt", 'wb')
try:
plik.write(str(self.kilometry))
self.kilometry_z = self.kilometry
finally:
plik.close()
--- Koniec kodu ---

* – w związku z częstotliwością zapisu stanu licznika, różnica może wynieść od 100 (wyłączanie symulacji w czasie postoju pojazdu) do 900 (wyłączanie symulacji przy jeździe z prędkością 160 km/h) metrów.

EP08_015:
Yb mnie by sie przydaly paranetry dla dizli. Prady napiecia obroty. Takze hamulec dynamiczny (niewiem jak dziala ale sp32 go ma).

jakubg1:
Odgrzewam wątek. Dzisiaj rozpocząłem kreowanie ekranu uruchamiania lokomotywy w ET22-2000. Aby to jednak zrobić, muszę uzależnić wszystko od wybranego kierunku jazdy. Póki co ta modyfikacja ma na celu coś takiego:

--- Kod: ---jeżeli nawrotnik jest w pozycji 0
wyświetl pusty ekran
w przeciwnym razie
wyświetl ekran normalnie (tak jak obecnie)

--- Koniec kodu ---
Niestety wywala błąd. Teoretycznie wszystko zrobiłem dobrze, a błąd polega na tym że nie ma odwołania do lokomotywy (!) mimo że nie znalazłem tej definicji. Jak go naprawić? Podaję plik pythona i log.
PS. Dodać do dozwolonych typów plików rozszerzenie *.py.

EDIT: Jakieś pomysły? Już tydzień bez rozwiązania...

Stele:
Przecież ci tłumaczyłem, że zjadłeś jedną z głównych metod. Poprawiłeś to?

youBy:
Po pierwsze, funkcja __init__ wykonuje się tylko raz, więc pakowanie tam warunków nie ma sensu. Po drugie, funkcja __init__ nie ma dostępu do słownika (state). Wynika to wprost z argumentów, jakie ona przyjmuje. Moja propozycja jest taka: w __init__ wczytujesz oba tła (jako moj_obrazek i moj_obrazek2), a następnie w _render sprawdzasz kierunek i dopiero wtedy albo używasz moj_obrazek i nie robisz nic, albo moj_obrazek2 i rysujesz wszystko.

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

[*] Poprzednia strona

Idź do wersji pełnej
Powered by Advanced Topic Prefix Pro
Powered by SMFPacks Likes Pro Mod