Interaktív teremkereső és útvonaltervező az OA épülethez. Egyetlen, önálló HTML fájl — nincs build lépés, nincs függőség, nincs csomagkezelő.
Élő oldal: https://mayydayy99.github.io/oemap/
| Fájl | Szerep |
|---|---|
index.html |
Maga az alkalmazás (HTML + CSS + JS egy fájlban) |
fonts/ |
Saját kiszolgálású betűtípusok + licencek |
icons/ |
Alkalmazásikonok (a Metropolisszal generálva) |
manifest.webmanifest |
PWA leíró — telepíthetőség |
sw.js |
Service worker — offline működés |
data/ |
Foglalható termek és foglaltságuk (generált) |
tools/ |
Az adatot előállító szkriptek és a QR-ív generátora |
tests/ |
Böngészős regressziós tesztek (npm test) |
meres.html |
Telefonos mérőlap: az Épület nézet mozdulatainak képkockaideje egy valódi telefonon |
CLAUDE.md |
Fejlesztői jegyzet — ezt olvasd, mielőtt hozzányúlsz |
docs/ |
Nyitott kérdések, amik külső információra várnak |
.github/workflows/deploy-pages.yml |
Automatikus deploy GitHub Pages-re |
.nojekyll |
Kikapcsolja a Jekyll feldolgozást |
Nincs külső hivatkozás. A betűtípusok a fonts/ mappából jönnek, minden más
— a teremadatok, az alaprajz geometriája, az útvonalkeresés — az index.html-en
belül van. Így az oldal külső szolgáltató nélkül, offline is működik.
Az app Alaprajzzal indul — telefonon ez a nézet 76 fps az Épület 13-ával szemben, és nagyításkor éles marad, mert nincs 3D kontextus. Az Épület nézet gombbal érhető el. Asztalon Épület nézetben is éles marad a nagyított kép: amikor a nagyítás megáll, az aktív szint a nagyításhoz illő felbontással rajzolódik újra.
Épület nézetben az aktív szint alaprajza mindig olvasható marad: a falai alatt, a néző felé világos oldallap van, amitől kicsit kiemelkedőnek látszanak, így akkor is kiválik, ha a helyiségei mind szürkék (a Félemelet csupa lépcsőpihenő), a fölötte lévő emeletek födémje pedig halványodik, mert az a néző felé esik, és egymásra rétegződve kitakarná. Minél meredekebben nézed, annál inkább visszajönnek — élből úgysem takarnak, és ott a köteg mondja el, hogy hány emeletes az épület. Az aktív szint alatti emeletek végig teljes erősséggel maradnak.
Épület nézetben az aktív szint teremszámai egyenesen állnak a termük fölött, bármerre forgatod vagy döntöd a képet, mint egy térképalkalmazásban. Hogy mennyi szám fér ki, azt a nagyítás dönti el, nem a dőlés: nagyítva egyre több jön elő, és élből nézve is ott maradnak. Ahol egymásra lógnának, ott a nagyobb terem száma marad. Mozgás közben nem villognak: ami látszik, az a helyén marad, amíg van helye. A nézetváltás, az illesztés vagy a szintváltás mozgása alatt eltűnnek, és a végén az új helyükön úsznak be; ujjal mozgatva végig követik a képet.
A mosdókon, lépcsőházakon és a liften piktogram áll a teremszám helyett (női, férfi, akadálymentes mosdó, lépcső, lift), alaprajzon helyiségenként. Épület nézetben magonként egy jelvény mutatja, mi van ott (például lépcső, férfi és női mosdó), hogy a szomszédos jelek ne takarják ki egymást; ezek alapnagyításon is mind kint vannak.
A fejlécben a Hallgatói / Minden kapcsoló dönti el, mely helyiségek látszanak. Hallgatói nézetben az irodák, üzemeltetési terek, raktárak és dolgozói területek halványan, felirat nélkül jelennek meg — ez a 223 helyiségből 109. Nem tűnnek el: a födém sziluettje az összes poligonból áll össze, kivéve őket lyukas lenne az alaprajz. Keresésből és kiválasztásból sem esnek ki, csak nem versenyeznek a figyelemért.
| Alaprajz | Épület | |
|---|---|---|
| egy ujj / egér húzás | tolás | forgatás — vízszintesen a tengely körül, függőlegesen a dőlés (15°–85°) |
| két ujj: húzás | tolás | tolás |
| két ujj: csippentés | nagyítás | nagyítás |
| két ujj: csavarás | forgatás az ujjak közepe körül | forgatás |
| két ujj: függőleges húzás | felemeli a tervlapot Épület nézetbe, 0°-ról, folyamatosan | dőlés (15°–85°), az ujjak alatti pont körül |
| görgő | nagyítás | nagyítás |
| Shift + húzás (egérrel) | tolás | tolás |
| ⤢ gomb | képre igazít és visszaforgatja a tervlap rajzolt állásába | képre igazít és visszaállítja az alapállást |
A tolás, a nagyítás és a forgatás egyszerre is mehet, ahogy a térképalkalmazásokban megszokott: csippentés közben csavarva a térkép egyszerre nagyít és fordul. A forgatás 8° elcsavarás után indul — enélkül minden csippentés fordítana is egy keveset, mert a két ujj sosem pontosan egy tengely mentén mozdul.
A döntés kivétel: az kizárja a többit. Ugyanaz a függőleges elmozdulás tolásnak is olvasható, a kettő nem mehet egyszerre, ezért a mozdulat az első határozott mozzanatnál eldől, és a fogás végéig ott marad. Döntésnek az számít, ha mindkét ujj legalább 16 px-et mozdul függőlegesen, azonos irányba, a függőlegeshez képest ~19°-os kúpon belül, és közben a távolságuk alig változik. Ennek ára van: Épület nézetben a majdnem függőleges kétujjas húzás már nem tol, hanem dönt — így működik a Google Maps is. Tolni ferdén vagy vízszintesen lehet, asztali gépen Shift + húzással is.
A döntés oda-vissza jár, és folytonos. Az Alaprajz maga a 0°-os kamera: a felfelé húzás innen emeli fel a tervlapot, ugrás nélkül — az első pillanatban a kép pontosan az alaprajz, és a dőlés az ujjal együtt nő. A sík az ujjak alatti pont körül billen, nem az épület közepe körül, így nagyítva sem csúszik ki a kéz alól. Félúton, 7,5°-nál vált át a kép 3D-s megjelenésbe (árnyék, szintfeliratok, a falak oldallapja), innen úsznak be a többi szintek, és 15°-ra nyílik szét a köteg.
Az Épület nézet 15° alatt nem nyugszik meg: elengedve oda úszik, aminek a kép épp mutatja magát. A 3D-s megjelenés előtt vissza Alaprajzra — pontosan oda, ahonnan felemelted —, utána föl 15°-ra. Lefelé húzva ugyanez visz vissza az Épület nézetből. A döntés közben nem vált oda-vissza, csak az ujjak felemelésekor, így a határon nem billeg. Az Épület nézet egyujjas mozdulata körbejárás marad, attól nem esel ki a nézetből.
Az irány a két nézetben közös, és mindkettő alapállása a tervlap rajzolt állása: a csavarás mindkettőben ugyanannyival fordít, és a nézetváltás meg a felemelés is megtartja. (Az Épület nézet korábban 30°-kal elfordítva, izometrikusan indult — ettől a felemelés első pillanatában elfordult a kép.)
Az alsó lapot a fejléc bármely pontjáról lehet húzni, és a lista tetejéről lefelé is. Az elengedés sebessége számít: egy határozott pöccintés a mozgás irányában lép a következő állásra.
A térkép egy tab-állomás — nem 222 —, és onnan a nyilak viszik tovább:
| billentyű | mit csinál |
|---|---|
| Tab | a térképre lép (a fejléc, a kereső és a gyorsgombok után) |
| nyilak | a szomszédos helyiségre lép abban az irányban |
| Enter / szóköz | kiválasztja a fókuszált helyiséget |
| Home / End | a szint első, illetve utolsó helyisége |
| Page Up / Page Down | szintet vált |
| Esc | vissza a térképre, majd törli a kiválasztást |
/ |
a keresőmezőbe ugrik |
A helyiségek gombok, a nevük a teremkód és a funkció, a kiválasztott terem
aria-pressed-et kap. A kiválasztás, az útvonal eredménye és a szintváltás
élő régióban is elhangzik, így képernyőolvasóval is követhető. A felolvasó az
aktív szintet látja: a födém, a falak, a feliratok és az útvonalrajz
aria-hidden, mert ugyanazt mondanák el, amit a panel szövegesen.
A nyilas bejárás azokat a helyiségeket járja be, amelyek látszanak is — hallgatói nézetben a hallgatóiakat. A halványított termek kereséssel és megosztott linkkel ugyanúgy elérhetők, a fejléc kapcsolója pedig egy tabbal odébb van.
Az oldal telepíthető webalkalmazás. Androidon a böngésző menüjében „Alkalmazás telepítése", iOS-en Safari → Megosztás → „Hozzáadás a főképernyőhöz". Telepítés után a teljes app offline is elindul — a service worker az első betöltéskor elteszi a HTML-t, a betűket és az ikonokat. Az épületben, gyenge térerővel is működik.
Frissítés: a dokumentumot hálózat-először kéri le, így egy új deploy a következő indításnál azonnal megérkezik; offline a gyorsítótárazott példány jön.
Az állapot a címsorban él, így az útvonal megosztható, könyvjelzőzhető, és a vissza gomb visszalép benne — telepített appban e nélkül a vissza egyszerűen kilépne:
| link | mit jelent |
|---|---|
#OA10E18 |
ez a terem ki van választva |
#from=OA00FK1 |
„itt vagyok" — az indulás megvan, a célt a hallgató adja meg |
#from=OA00FK1&to=OA10E18 |
kész útvonal |
#to=OA10E18 |
útvonal a portától |
#from=OA00FK1&to=OA10E18&via=lift |
kész útvonal, lifttel |
Alapból a portáról indul a navigáció (OAX1A02, az alagsori bejárat mellett): ha a hallgató célt választ („Ide", link, gyorsgomb), de indulást nem, az útvonal onnan számol. Amit maga ad meg (QR-kód, „Innen"), az felülírja. A gyorsgombok közül a Legközelebbi mosdó három sort ad — női, férfi, akadálymentes —, mindegyikből a menetidő szerint legközelebbit (a lépcsőzéssel együtt; a dolgozói öltöző mosdói és az irodákból nyíló mosdók nélkül), a Büfé a büfét.
Az útvonal az ajtónál ér véget, nem a teremhez legközelebbi folyosóponton:
az ajtók helyét az épület IFC-modelljéből vesszük (tools/ifc-ajtok.py). Ha a
teremnek több ajtaja van, a közelebbihez visz. Ahova csak egy másik helyiségen
át lehet bejutni — a II. emeleti laborsorba az E01-en és az E03-on át, több
irodába a szomszédosból —, ott az útvonal annak az ajtajáig vezet, és a
lépések közt ott áll: „Bejárat ezen át: 2.32 · LABOR → 2.24 · LABOR".
A lépések az ajtón álló számot írják ki, a lépcsőzést pedig egy lépésben, a célszinttel: „Lépcsőn fel a II. emeletre · Lépcsőház · OA00FL3 · 2 szint" (angolul „Take the stairs up to the 2nd floor”). A félemelet a lépcsőházak pihenője, a szintváltások közt fél emeletnek számít.
Asztalon és a totemen az útvonal alatt a Küldd el a telefonodra gomb QR-kódot mutat. A telefon kamerájával beolvasva ugyanez az útvonal nyílik meg rajta, a lift választásával együtt, és onnan a hallgató viszi magával. Telefonon nincs ilyen gomb: ott a megosztás gomb ugyanezt tudja.
Egy e-totemen az app a saját helyéről indul, és magától visszaáll:
https://mayydayy99.github.io/oemap/?totem#from=OA00FK1
A from a totem helye. Induláskor egy felirat jelzi, hogy totem módban fut —
ha nem jelenik meg, a cím nem kért totem módot. A totem a link végére, a #
után írva is működik (…/oemap/#from=OA00FK1?totem), az app a szokásos alakra
igazítja. Egy perc tétlenség után minden visszaáll (az indulás, magyar nyelv,
alaprajz, cél nélkül); tíz másodperccel előtte szól, és egy érintés
megállítja. Mozdulat közben soha nem áll vissza. Naponta egyszer újratölt, hogy
a friss adat és a friss kód is megjöjjön. A totemről küldött QR-kód linkje már
nem totem mód: a telefonon nem áll vissza semmi.
A totemen a teljes linket a böngésző kioszk módjában nyisd meg, ne a telepített
appot: az a kezdőlapjáról indul, ?totem nélkül.
Ismeretlen kódot a link csendben elhagy: az app elindul, csak épp kiválasztás
nélkül. A panelben a megosztás gomb a pillanatnyi állapot linkjét adja —
navigator.share-rel, ahol van, különben vágólapra.
Beltérben a GPS nem ad emelet- vagy teremszintű pontosságot, ezért a „hol
vagyok?" kérdésre a hallgatónak kellene válaszolnia. Egy falra ragasztott QR
ezt leveszi róla: a kód a #from=<terem> linkre mutat, így az app már tudja,
honnan indul. Se engedélykérés, se hálózat — a telepített PWA offline is
elindul.
python3 tools/make-qr.py https://mayydayy99.github.io/oemap/ qr.html
Nyomtatható A4-es ív lesz belőle, szintenként csoportosítva: 41 kód a
közlekedőkre, előterekbe és közösségi terekre. Egy-egy szintre szűkíthető a
szintszámok megadásával (... qr.html 0 1).
A kereső alatti gyorsgombok közt a Foglalható termek megmutatja, melyik OA-terem szabad vagy foglalt éppen, és ha foglalt, milyen óra van benne (tárgy, előadás/gyakorlat/labor, meddig). Kinyitva a napi órák és a felszereltség látszik. Elöl az áll, ami most szabad: ha az indulás megvan (QR-kód, totem, „Innen”), a menetidő szerint — minden sorban ott a perc —, különben aszerint, meddig marad szabad; a foglaltak közül az, amelyik hamarabb felszabadul.
Az adat két forrásból áll össze, a hivatalos teremnéven:
| forrás | mit ad | feldolgozó |
|---|---|---|
ingatlan.uni-obuda.hu/termek mentett lapjai |
név, férőhely, felszereltség | tools/parse-rooms.py |
| Neptun kurzusórarend-export (xlsx) | a félév heti órái termenként | tools/parse-neptun.py |
python3 tools/parse-rooms.py mentett*.htm > data/rooms.json
python3 tools/parse-neptun.py 2026-27-1-NIK-kurzus-orarend-adatok-v1.xlsx /tmp/neptun.json
python3 tools/build-termek.py data/rooms.json /tmp/neptun.json data/termek.json \
--het1 2026-09-07 --hetek 14 --szunnap 2026-10-23
Egy export egy egész félévre szól, félévente egyszer kell lefuttatni. A
--het1 az 1. oktatási hét hétfője, a --szunnap az óraszünetes napok
vesszővel — egyik sincs benne az exportban.
Mikor nem mond „szabad"-ot. A félév oktatási hetein kívül „nincs adat", ünnepnapon „nincs óra". Az F-blokkban és az Audmaxban más karok (KVK, RKK) is tartanak órát, az ő óráik viszont nincsenek benne a NIK-exportban — ezért ott óra híján „Szabad?" áll, nem „Szabad". Ha a többi kar exportja is megvan, az ugyanígy feldolgozható.
Ezek nem az alaprajz kódjai. Az F01…F09, az Audmax és a laborok
(1.10…2.20) az ajtón álló teremszámok (a Neptunban BA.F.01,
BA.1.13); a tervlap más (üzemeltetési) számozást használ. Például az F01
a tervlap OA00F11-e, a tervlapi OA00F01 pedig az F08. A kettőt az app
NEPTUN táblája köti össze, az Egyetemi Tervtár épületadataiból (a kari
nyilvántartás oszlopa; tools/tervtar-ajtoszam.py): most 112 helyiség,
köztük mind a 24 órarendi terem. A térkép felirata, a kereső (pont
nélkül is: 110) és az adatlap az ajtószámot mutatja, és a teremre
kattintva az adatlapján ott a foglaltság is; a foglalható termek listájából
pedig a Megmutatom a térképen gomb visz a teremhez. A felső szárny
északkeleti vége (F05, F06, 1.13…1.19, 2.13…2.20 és a szárny
irodái) korábban hiányzott a térképről; a tervtári alaprajz PDF-jéből
pótoltuk (tools/tervlap-szarny.py).
A földszinten a tervlap is F01…F14-nek számozza a helyiségeit (a büfé ott
F04), ezért ahol nincs ajtószám, a térképen a teljes tervlapi kód áll
(OA00F04), nem egy teremszámnak látszó rövid kód.
Párosító mód. Ha egy pár hiányzik vagy vitatott, az épületet ismerő ember
megadhatja az appban: https://mayydayy99.github.io/oemap/?parosit.
Kattints egy teremre, válaszd ki a Neptun-nevét; a panel alján a Lista
másolása a párokat F01 = OA00F11 alakban adja, ezt kell a NEPTUN
táblába írni. Addig a helyben megadott párok csak ebben a módban, azon az
eszközön látszanak.
Részletek: docs/NYITOTT-KERDESEK.md.
Az Óbudai Egyetem Brand Guide 2026 / 1.0 szerint:
| Elsődleges szín | #00288C (sötét téma: #799AEC, a brand kék világosított változata) |
| Cím / rövid szöveg | Metropolis (400/600/700) |
| Folyó szöveg | Open Sans (400/600) |
| Teremkódok | IBM Plex Mono — a 0/O megkülönböztetése tájékozódásnál funkcionális |
Az útvonal narancs marad: tájékozódási szín, nem arculati elem, és a kézikönyv másodlagos színei közül egyik sem ad elég kontrasztot a világos alaprajzon. A helyiség-kategóriák színei nem a márkához, hanem az Egyetemi Tervtár funkcióalaprajzaihoz igazodnak: a színkulcsuk (alapinformációk, 2026.02.24) 15 színe, az ő sorrendjükben, az építészek kérésére. A hallgatói nézetben a dolgozói helyiségek ugyanebben a színben, halványan állnak.
A betűtípusok szabadon terjeszthetők (Metropolis: public domain, Open Sans és
IBM Plex Mono: SIL Open Font License); a licencfájlok a fonts/ mappában vannak.
A deploy-pages.yml workflow minden pusholásnál lefut, és a repó tartalmát
kirakja GitHub Pages-re. Kézzel is indítható: Actions → Deploy to GitHub Pages
→ Run workflow.
- Settings → Pages
- Build and deployment → Source: válaszd a GitHub Actions opciót
Ezt egyszer kell megcsinálni, és nem lehet automatizálni: az Actions
GITHUB_TOKEN deployolni tud a Pages-re, de magát a Pages site-ot létrehozni
nem — ahhoz repo admin jog kell. Amíg ez nincs kész, a workflow a Setup Pages
lépésnél Get Pages site failed hibával leáll.
Ha megvan, indítsd újra a legutóbbi futást (Actions → Deploy to GitHub Pages → Re-run jobs), vagy pusholj egyet. Az élő URL az Actions futás összegzésében és a Settings → Pages oldalon is megjelenik.
Ha a deploy
Branch not allowed to deployhibával áll meg, akkor agithub-pagesenvironment ághoz van kötve: Settings → Environments → github-pages → Deployment branches alatt engedélyezd az ágat, amelyikről deployolsz.
Elég megnyitni a fájlt a böngészőben:
open index.html
Vagy egy helyi szerverrel:
python3 -m http.server 8000
# majd http://localhost:8000
npm install # playwright
npm test # mind a 21 tesztfájl
A tesztek maguk indítanak szervert és böngészőt szabad porton, így nem kell
előre semmit elindítani. Egy-egy fájl külön is futtatható:
node tests/run.js url share.
Mit őriznek, és miért pont azt, arról a CLAUDE.md ír. A rövid verzió: mindegyik teszt egy valódi, egyszer már bejelentett hibát tart távol — a befagyó térképet, az elérhetetlen panelaljat, a hamisan „szabad" termet.
Az alkalmazás cseréjéhez írd felül az index.html fájlt, és pushold — a deploy
magától lefut. Ha a fájl újragenerált változatát teszed be, ne felejtsd el a
fonts/ mappára mutató @font-face blokkot és az arculati színeket átvinni.