M ASARYKOVA UNIVERZITA FAKULTA INFORMATIKY
}
w A| y < 5 4 23 1 0 / -. , )+ ( %&' $ # !"
Æ
Editor rozložení modelových drah ˇ B AKALÁ RSKÁ PRÁCE
Milan Skipala
Brno, jaro 2014
Prohlášení Prohlašuji, že tato bakaláˇrská práce je mým puvodním ˚ autorským dílem, které jsem vypracoval samostatnˇe. Všechny zdroje, prameny a literaturu, které jsem pˇri vypracování používal nebo z nich cˇ erpal, v práci rˇ ádnˇe cituji s uvedením úplného odkazu na pˇríslušný zdroj.
Milan Skipala
Vedoucí práce: RNDr. Jan Kasprzak i
Podˇekování Rád bych podˇekoval svému vedoucímu, RNDr. Janu Kasprzakovi, za to, že mi vˇenoval cˇ as na konzultacích, a za odbornou pomoc pˇri psaní bakaláˇrské práce.
ii
Shrnutí Tato práce se zabývá porovnáním existujících nástroju˚ pro editaci dráhy modelové železnice nebo autodráhy. Cílem práce je vytvoˇrení vlastního editoru, který bude vyhovovat uvedeným požadavkum. ˚ Text práce popisuje proces vývoje programu a návrhu algoritmu˚ pro práci s modelem.
iii
Klíˇcová slova Autodráha, modelová železnice, Rail & Slot Editor, Qt, editor modelové dráhy
iv
Obsah 1 2
Úvod . . . . . . . . . . . . . . . . . . . . . . Srovnání existujících programu˚ . . . . . . 2.1 Anyrail . . . . . . . . . . . . . . . . . . 2.2 Scalextric Track Designer . . . . . . . . 2.3 SCARM . . . . . . . . . . . . . . . . . . 2.4 Ultimate Racer . . . . . . . . . . . . . . 2.5 XTrkCAD . . . . . . . . . . . . . . . . . 3 Funkcionalita vlastního programu . . . . . 4 Použité technologie . . . . . . . . . . . . . 5 Poˇcátky vývoje programu . . . . . . . . . . 6 Elementy uživatelského rozhraní . . . . . 6.1 Tˇrídy Application a Window . . . . . 6.2 Tˇrída WorkspaceWidget . . . . . . . . 6.3 Tˇrída SideBarWidget . . . . . . . . . . 6.4 Doplnkové ˇ prvky grafického rozhraní 7 Reprezentace modelu v programu . . . . . 7.1 Druhy dílu˚ . . . . . . . . . . . . . . . . 7.2 Grafická reprezentace dílu˚ . . . . . . . 7.3 Tˇrída ModelItem . . . . . . . . . . . . 7.4 Tˇrída ModelFragment . . . . . . . . . 7.5 Tˇrídy pro nekolejové díly . . . . . . . 7.6 Knihovna dílu˚ . . . . . . . . . . . . . . 8 Manipulace s modelem . . . . . . . . . . . 8.1 Vložení nového dílu . . . . . . . . . . 8.2 Posun a otáˇcení . . . . . . . . . . . . . 8.3 Odstranˇení dílu˚ . . . . . . . . . . . . . 8.4 Spojování trat’ových úseku˚ . . . . . . 8.5 Výškový profil trati . . . . . . . . . . . 8.6 Vyrovnání nepˇresností trati . . . . . . 8.7 Automatické dopoˇcítání trati . . . . . 8.7.1 Algoritmus cˇ . 1 . . . . . . . . . 8.7.2 Algoritmus cˇ . 2 . . . . . . . . . 9 Model jako sada pˇríkazu˚ . . . . . . . . . . 9.1 Funkce Zpˇet a Znovu . . . . . . . . . . 9.2 Funkce spojené s kopírováním dílu˚ . . 9.3 Funkce Nový, Otevˇrít, Uložit . . . . . 10 Práce s inventáˇrem . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 3 3 5 6 8 9 11 13 15 16 16 17 18 18 19 19 21 22 23 24 25 27 27 29 29 30 31 32 34 34 35 39 41 42 42 44 v
11 Použití programu v praxi . . . . . 12 Závˇer . . . . . . . . . . . . . . . . . Literatura . . . . . . . . . . . . . . . Seznam obrázku˚ . . . . . . . . . . . Seznam tabulek . . . . . . . . . . . Seznam algoritmu˚ . . . . . . . . . . A Prototypy uživatelského rozhraní B Obsah CD . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
45 46 47 49 50 51 52 54
vi
1 Úvod Železniˇcní a autodráhové modeláˇrství patˇrí mezi modeláˇrské cˇ innosti, které, aˇckoliv to nemusí být na první pohled zcela zˇrejmé, mají rˇ adu vˇecí spoleˇcných. V obou pˇrípadech máme model vlaku nebo automobilu, který se pohybuje po dráze, jež v pˇrípadˇe železnice nemusí být nutnˇe uzavˇrená, a v obou pˇrípadech kopíruje povrch terénu, do nˇehož je zasazená. Stavba modelové železnice v klasickém pˇrípadˇe probíhá tak, že si modeláˇr obkreslí na papír obrysy jednotlivých dílu˚ a poskládá si železnici naneˇcisto. Teprve když je s tímto papírovým „modelem“ spokojený, zaˇcne stavˇet skuteˇcný model. Pokud modeláˇr využije moderní technologie, navrhne si dráhu ve specializovaném programu, vˇetšinou i vytiskne a poté sestavuje reálný model. Existuje rˇ ada programu, ˚ které umožnují ˇ vystavˇet bud’ modelovou železnici, nebo autodráhu, ale velmi málo z nich podporuje obojí (z programu, ˚ které jsem testoval, je to pouze AnyRail [1]). Výbˇer použitelných programu˚ se dále dramaticky zúží, pokud se omezíme na operaˇcní systémy UNIX. Pokud vyˇradíme z výbˇeru programy, které fungují zárovenˇ jako rˇ ídicí systémy pro digitální železnici cˇ i autodráhu, zustane ˚ nám program XTrackCAD [2], který funguje dobˇre, ale v nˇekterých oblastech ho pomˇernˇe snadno pˇredstihnou programy pro Windows. Cílem této práce bylo vytvoˇrit editor, který byl primárnˇe navržen pro systémy typu UNIX. Mezi jeho hlavní pˇrednosti patˇrí snadné a intuitivní ovládání, jednoduché rozšíˇrení databáze dílu, ˚ což je u rˇ ady jiných programu˚ velký problém, nebo dopoˇcítání trati do uzavˇrené podoby. Vyznaˇcuje se také tím, že je možné pracovat s výškovým profilem, což u jiných programu˚ nemusí být samozˇrejmost (napˇr. Ultimate Racer [3]). Editor je naprogramovaný v jazyce C++ s využitím toolkitu (sada knihoven a nástroju˚ pro vývojáˇre) Qt5 [4]. Zvažoval jsem i použití jiného programovacího jazyka a toolkitu. Rozbor možných alternativ a duvody, ˚ které vedly k tomuto rozhodnutí, jsou uvedeny v kapitole Použité technologie. Editor byl vyvíjen v nˇekolika fázích. Nejdˇríve jsem otestoval nˇekolik programu˚ z oblasti železniˇcního a autodráhového modeláˇrství (AnyRail 5 [1], Scalextric Track Designer [5], SCARM [6], Ultimate Racer 3.0 [3] a XTrkCAD [2]), poznaˇcil si silné a slabé stránky každého z nich a na základˇe této analýzy jsem sestavil seznam funkcí, které bude muj ˚ editor podporovat. Detailní rozbor jednotlivých programu˚ je uveden v kapitole Srovnání existujících programu. ˚ V další fázi bylo tˇreba navrhnout uživatelské rozhraní a nauˇcit se pracovat s toolkitem Qt. Druhou zmínˇenou cˇ innost znaˇcnˇe
1
1. Ú VOD usnadnilo vytváˇrení vzorových programu˚ podle návodu˚ uvedených na oficiálních stránkách projektu Qt i z nˇekterých jiných zdroju. ˚ Dalším krokem byla implementace veškeré funkcionality. Postupoval jsem od základních funkcí, jako je vkládání dílu˚ a manipulace s cˇ ástmi modelu, k tˇem složitˇejším – napˇr. práce s výškovým profilem cˇ i dopoˇcítávání trati. Po dokonˇcení jednotlivých „tematických bloku“ ˚ jsem dané funkce otestoval. Bˇehem vývoje programu jsem také nˇekolikrát kontaktoval vedoucího kroužku železniˇcního modeláˇrství nedaleko mého bydlištˇe, aby on i jeho žáci otestovali rozpracovaný editor. Nakonec byl vytvoˇren manuál usnadnující ˇ použití složitˇejších funkcí editoru. Tato práce byla pˇrínosem jak pro mne samotného, tak i pro komunitu modeláˇru. ˚ Já jsem si vyzkoušel kompletní návrh a implementaci uživatelského rozhraní a program Rail & Slot Editor, který je výstupem této práce, pˇrináší modeláˇrum ˚ hned nˇekolik výhod. Zaplní mezeru v nabídce díky tomu, že je schopný bˇehu jak na poˇcítaˇcích s Windows, tak na systémech typu UNIX, umí pracovat s výškovým profilem trati a zvládá automaticky dopoˇcítávat trat’.
2
2 Srovnání existujících programu˚ První krok, který jsem pˇred zapoˇcetím prací na vlastní aplikaci uˇcinil, spoˇcíval v otestování už existujících editoru˚ a v porovnání funkcionality, kterou nabízejí. Následnˇe jsem na základˇe získaných výsledku˚ specifikoval funkce, které by mˇel podporovat i mnou vytvoˇrený program. Souˇcástí specifikace byly také vlastnosti cˇ i rˇ ešení, která nebyla pˇríliš vhodná, tedy taková, kterých se chci vyvarovat. Pro hodnocení programu˚ jsem si stanovil nˇekolik kritérií. Nejdˇríve jsem se pokusil postavit jednoduchou cˇ ást trati bez studování nápovˇedy, dokumentace apod., cˇ ímž jsem si vyzkoušel, jak složité je ovládání programu a do jaké míry je ovládání pomocí daného uživatelského rozhraní intuitivní. Další oblasti, které ovlivnily hodnocení, souvisejí se zohlednˇením výškového profilu trati, možností rozšíˇrení databáze dílku˚ a schopností vypoˇrádat se s nepˇresnˇe postavenou tratí a upravit ji do uzavˇrené podoby. Pˇri používání nˇekterých aplikací se také projevily jejich slabší stránky, které jsou popsány v podkapitolách, zabývajících se danými programy. Testování jsem podrobil aplikaci AnyRail [1], Scalextric Track Designer [5], SCARM [6], Ultimate Racer [3] a XTrkCAD [2]. Verze programu, ˚ které byly testovány, jsou uvedeny v pˇríslušných podkapitolách. Zvažoval jsem i výbˇer programu˚ Rocrail [7], Model Railroad System [8], ale tyto jsem do výbˇeru nezahrnul, protože se jedná o programy, které rˇ ídí i provoz na fyzicky existující trati. XTrkCAD je z vybraných jediný, který bˇeží na UNIXových systémech, ostatní jsou dostupné pouze pro operaˇcní systém Windows.
2.1
Anyrail
Program AnyRail, který je vyvíjený firmou DRail Modelspoor Software sídlící v Nizozemsku, byl testován ve verzi 5.0. Jedná se o komerˇcní software a testování byla podrobena jeho zkušební verze, jejíž jediné omezení spocˇ ívá v limitu použití 50 dílku˚ v jednom modelu. Vzhled uživatelského rozhraní pomˇernˇe silnˇe pˇripomíná „standardní“ vzhled aplikací od firmy Microsoft, který byl zaveden s pˇríchodem kanceláˇrského balíku Microsoft Office 2007. Okno je rozdˇeleno na horní pás karet, kde jsou seskupeny související ovládací prvky a knihovny trat’ových segmentu˚ a jiných objektu, ˚ tedy napˇr. vegetace nebo signálních zaˇrízení. AnyRail je jediný program z mnou testovaných, který umožnuje ˇ editaci jak železnice, tak autodráhy, což je jedna z jeho dobrých vlastností. Mezi nˇe 3
2. S ROVNÁNÍ EXISTUJÍCÍCH PROGRAM U˚ patˇrí také možnost vyrovnání drobných nepˇresností pˇri snaze postavit uzavˇrený okruh. Kladnˇe hodnotím i zpusob ˚ práce s jednotlivými knihovnami dílku, ˚ kdy je možné otevˇrít si více knihoven a pracovat s ruznými ˚ sadami objektu˚ (napˇr. železnice, signalizaˇcní zaˇrízení a vegetace) najednou. Dílky je možné do modelu pˇridávat 3 zpusoby: ˚ •
po kliknutí v knihovnˇe se vloží do scény a je nutné ho ruˇcnˇe pˇripojit ke zbytku modelu,
•
druhá možnost funguje na principu „Drag & drop“, tedy uživatel uchopí dílek v knihovnˇe a pˇretáhne ho na pracovní plochu, kde ho muže ˚ rovnou pˇripojit,
•
poslední možnost – kliknutí se soubˇežným stiskem klávesy Shift – pˇripojí nový dílek k tomu, který byl vytvoˇren jako poslední. Tato možnost vkládání pro mˇe byla pˇrekvapením a objevil jsem ji až po prostudování uživatelské pˇríruˇcky.
AnyRail umožnuje ˇ i práci s výškovým profilem trati a je možné nastavovat i pˇrevýšení v rámci nˇekolika dílku. ˚ Program následnˇe odvodí výšku v koncových bodech každého dílku. Mezi nedostatky tohoto programu se rˇ adí mírnˇe obtížnˇejší výbˇer autodráhových dílku˚ umístˇených na pracovní ploše. Dílek lze vybrat pohybem myši pouze pˇrímo nad nˇekterou dráhou, uprostˇred dílku nebo v blízkém okolí tˇechto oblastí. Jinde program vubec ˚ nereaguje na pohyb myši. Dále pˇri vkládání za pomoci klávesy Shift program pˇridá nový dílek do pevnˇe zadaného bodu. Pokud se uživatel rozhodne, že potˇrebuje pˇripojit dílek napˇr. na konkrétní vˇetev výhybky, nemuže ˚ použít rychlejší zpusob ˚ vložení dílku, tedy Shift + kliknutí myši. Tento zpusob ˚ vkládání také není pˇríliš spolehlivý pˇri stavbˇe autodráhy, kdy muže ˚ docházet k posunutí vloženého dílku o jednu dráhu. Program AnyRail neumožnuje ˇ volbu mezi pravotoˇcivou a levotoˇcivou zatáˇckou – problém je vyˇrešen opˇet samostatným vložením dílku na pracovní plochu a následným ruˇcním pˇripojením ke zbytku modelu. Databáze železniˇcních dílku˚ je velmi rozsáhlá – nabízí sortiment nˇekolika desítek výrobcu˚ v mˇerˇ ítkách od G až po Z. V oblasti autodráhy je nabídka podstatnˇe menší – uživatel se musí spokojit pouze s nabídkou firmy Scalextric. Absence vˇetšího množství výrobcu˚ autodráhy je pochopitelná, protože firma DRail Modelspoor Software prezentuje tento svuj ˚ produkt jako velmi dobrý editor pro modely železniˇcní, nikoliv autodráhové. Databázi lze rozšíˇrit o uživatelské objekty, což mohou být seskupené cˇ ásti mo4
2. S ROVNÁNÍ EXISTUJÍCÍCH PROGRAM U˚ delu, nebo celé tratˇe, ale není možné doplnit dílky od jiných výrobcu, ˚ což považuji za jednu z výraznˇejších slabin. Vytvoˇrený model lze exportovat do bitmapového obrázku nebo 3D souboru ve formátu Collada. Tisk je také dostupný a navíc si uživatel muže ˚ zvolit mˇerˇ ítko, v jakém má být tištˇený výstup zmenšený. Celkový dojem z programu AnyRail 5 je dobrý, s programem se mi pracovalo zpravidla dobˇre, ale obtˇežovaly mˇe drobné chyby v podobˇe zvláštního chování pˇri výbˇeru autodráhových dílku˚ a více zpusob ˚ u˚ vkládání dílu. ˚ Pokud by uživatel byl autodráhový modeláˇr, bylo by vhodné zvážit výbˇer jiného programu.
2.2
Scalextric Track Designer
Scalextric Track Designer je program vyvinutý firmou A-Lab Software Limited pro Hornby Hobbies Ltd., britského výrobce, který vlastní, kromˇe dalších znaˇcek železniˇcních modelu, ˚ i znaˇcku Scalextric. Program je dostupný zdarma na internetových stránkách výrobce a ke stažení je nutné se na stránkách bezplatnˇe zaregistrovat. Tento program je jediný z mnou vybraných, který umožnuje ˇ editaci a stavbu modelu pˇrímo ve 3D zobrazení. Nabízí i 2D mód, ale ten je realizovaný pomocí vhodnˇe umístˇené kamery nad trojrozmˇernou scénou. Ostatní programy standardnˇe pracují se zobrazením v rovinˇe a nˇekteré z nich umožnují ˇ náhled ve 3D, nebo alesponˇ export 3D dat. Po spuštˇení program zobrazí informaˇcní dialogové okno, kde jsou vysvˇetleny základní pˇríkazy pro manipulaci s modelem a zpusoby, ˚ jak se pohybovat ve scénˇe. V horní cˇ ásti okna se nachází nabídka dílu, ˚ ze kterých je možné stavˇet trat’. Uživatel má na výbˇer kompletní sortiment firmy Scalextric v mˇerˇ ítku 1:32, ale databázi nelze rozšíˇrit. Vzhledem k tomu, že se jedná o software dodávaný pˇrímo výrobcem autodráh, je tento fakt akceptovatelný. Kliknutím na náhled dílu v nabídce se díl vloží do scény. Následným stiskem mezerníku mužeme ˚ zmˇenit levotoˇcivou zatáˇcku na pravotoˇcivou a naopak. Mezi významné nedostatky tohoto programu se rˇ adí neschopnost spolehlivˇe rozlišit, zda spolu dva díly sousedí, cˇ i nikoliv. Dusledkem ˚ je hned nˇekolik problému: ˚ je možné vkládat díly i v bodech, kde už jsou pˇripojeny díly jiné, pro posunutí celého modelu je nezbytné vybrat postupnˇe všechny díly, kterými budeme posouvat a dále je také negativnˇe ovlivnˇena práce s výškovým profilem. S vkládáním dílu˚ navíc souvisí ještˇe jedna komplikace. Po vložení dílu je možné ho uchopit a posunout. Tím se díl odpojí 5
2. S ROVNÁNÍ EXISTUJÍCÍCH PROGRAM U˚ od zbytku trati a uživatel ho muže ˚ pˇripojit na jiné místo modelu. Komplikace nastává ve chvíli, kdy uživatel opravdu chce díl pˇripojit. Velmi cˇ asto se totiž dílek zaˇcne skokovˇe otáˇcet a posouvat, ale pˇripojit se podaˇrí obvykle jen na puvodní ˚ místo. Program umožnuje ˇ zohlednˇení výškového profilu trati, což je, zvláštˇe u 3D zobrazení, velmi pˇrínosné. Uživatel si muže ˚ nastavit nejen celkovou výšku dílku, ale navíc i podélný sklon. Díky už zminovanému ˇ problému se sousedstvím dílu˚ je ovšem nutné nastavit výšku cˇ i sklon oddˇelenˇe pro všechny úpravou dotˇcené díly. Pˇri nastavení stoupání zatáˇcky se vyskytne nedostatek spíše estetického charakteru. Pokud zatáˇcka sousedí s rovným dílem, vznikne nastavením sklonu schod a díly na sebe opticky nenavazují. Tento problém by se dal asi nejsnáze odstranit pˇridáním možnosti nastavení boˇcního náklonu dílu a uživatel by pak mohl vzniklou situaci vyˇrešit sám. Vytvoˇrený model trati lze vytisknout na tiskárnˇe, ale nelze ho uložit do obrázku. Tato funkce sice muže ˚ chybˇet, zejména pokud není tiskárna dostupná z poˇcítaˇce, na kterém je program nainstalovaný, ale nepovažuji to za vážnˇejší nedostatek. Aplikace Scalextric Track Designer poskytuje základní funkce pro manipulaci s modelem a pro nastavení výšky trati, ale chování nˇekterých funkcí je tˇežko pˇredvídatelné. Tyto nedostatky zhoršují použitelnost programu a dˇelají práci s ním spíše nepˇríjemnou.
2.3
SCARM
Program SCARM vytvoˇril bulharský vývojáˇr Milen Peev, jedná se o freeware a testována byla verze 0.9.2 Beta. Název vznikl zkrácením slov Simple Computer Aided Railway Modeller, v pˇrekladu Jednoduchý nástroj pro poˇcítaˇcem provázené modelování železnice. Poté, co program spustíme, nás pˇrivítá základní obrazovka, na níž najdeme velkou pracovní plochu a postranní panel, ve kterém se zobrazuje nabídka trat’ových segmentu˚ od výrobce, kterého si mužeme ˚ zvolit v horní cˇ ásti tohoto panelu. Vložení dílku na pracovní plochu je velmi jednoduché – pokud chceme vložit rovný úsek trati, staˇcí kliknout na náhled dílku, pokud požadujeme vložení zatáˇcky, musíme kliknout na náhled dílku a následnˇe vybrat levotoˇcivou nebo pravotoˇcivou zatáˇcku. Pro usnadnˇení stavby modelu program nabízí i funkci zopakování posledního dílku. Stisknutím mezerníku vložíme poslední použitý dílek do bodu, který je právˇe vybraný jako aktivní. Výbˇer bodu˚ je realizovaný pomocí kliknutí na pˇríslušný bod, druhá možnost je pˇrepínání na nejbližší další cˇ i pˇredchozí koncový bod stiskem 6
2. S ROVNÁNÍ EXISTUJÍCÍCH PROGRAM U˚ tlaˇcítka v horní nástrojové lištˇe. Pokud si uživatel pˇreje vytvoˇrit nový bod a zaˇcít tak tvoˇrit další samostatnou cˇ ást trati, je tˇreba kliknout na tlaˇcítko v nástrojové lištˇe a oznaˇcit požadovaný bod na pracovní ploše. Posunutí dílku zpusobí, ˚ že se odpojí od okolní trati, což je stejný princip jako u aplikace od firmy Scalextric. SCARM navíc po dvojím kliknutí na dílek vybere celý úsek trati, ve kterém se daný dílek nachází. Tato funkce by v programu firmy Scalextric témˇerˇ jistˇe našla svoje využití. Bˇehem stavby modelu muže ˚ nastat situace, kdy napojení dílku˚ není naprosto pˇresné a je nutné model mírnˇe ohnout tak, aby se trat’ spojila. S tímto problémem si musí uživatel poradit manuálnˇe, a sice tak, že jednotlivé dílky odpojí a znovu pˇripojí posunutím ke zbytku modelu, pˇriˇcemž pˇripojení toleruje drobné nepˇresnosti. SCARM, podobnˇe jako ostatní testované programy, zvládá práci s výškovým profilem. Nejdˇríve je nutné zapnout režim pro úpravu výšky, následnˇe si uživatel vybere jeden cˇ i více dílku, ˚ které budou úpravou dotˇceny a nakonec vybere bod, ve kterém se bude mˇenit výška. Výšku je možné mˇenit pomocí tlaˇcítek v nástrojové lištˇe a v pˇrípadˇe, že si uživatel vybral spojitou cˇ ást trati, se stoupání rozloží mezi všechny vybrané díly. Kromˇe výšky v konkrétních bodech má uživatel pˇrehled také o stoupání vyjádˇreném ve stupních. Mezi jednu z dobrých vlastností tohoto programu patˇrí také 3D náhled vytvoˇreného modelu. Je možné si prohlédnout model z ruzných ˚ úhlu˚ a uživatel tak muže ˚ mít detailnˇejší pˇrehled o tom, jak bude model vypadat ve skuteˇcnosti. Po dokonˇcení modelu máme na výbˇer export do obrázku ve formátu BMP nebo model mužeme ˚ vytisknout. 3D náhled navíc umožnuje ˇ sejmutí obrázku a uložení opˇet ve formátu BMP. Kromˇe toho má uživatel k dispozici funkci, která vygeneruje HTML dokument se seznamem použitých dílku˚ vˇcetnˇe jejich náhledu.Databáze ˚ obsahuje více než 30 výrobcu˚ a vˇetšina z nich má v nabídce trat’ové díly ruzných ˚ mˇerˇ ítek. Databáze má formu textových souboru˚ a je možné pˇridat si vlastní databázový soubor. Tuto úpravu ale komplikuje skuteˇcnost, že soubory neobsahují, s výjimkou identifikace výrobce, názvy polí nebo jiné vodítko, které by pomohlo ve vyplnování ˇ dat. Jakékoliv rozšíˇrení databáze tedy nejspíše bude provedeno metodou pokus-omyl. Program SCARM je velmi kvalitní a práce v nˇem je rychlá a intuitivní. Za nejvˇetší nedostatek považuji absenci autodráhových dílu, ˚ nebot’ pokud by aplikace podporovala práci s nimi, jednalo by se o dobˇre fungující univerzální aplikaci pro autodráhové i železniˇcní modeláˇre. Kromˇe horší rozšiˇritelnosti databáze jsem nenarazil na jiné problémy. 7
2. S ROVNÁNÍ EXISTUJÍCÍCH PROGRAM U˚
2.4
Ultimate Racer
Ultimate Racer je komerˇcní aplikace. Testována byla verze 3.0 bez licenˇcního cˇ ísla, tedy ve zkušebním režimu. Ten spoˇcívá v omezeném poˇctu dílu, ˚ které lze uložit. Tento program je mnohem komplexnˇejší, než ostatní testované, protože kromˇe vytváˇrení a editace autodráhy umožnuje ˇ také vedení databáze závodníku˚ a vozidel, evidenci výsledku˚ a dle informací v nápovˇedˇe je schopen komunikovat pˇrímo s autodráhou a zjišt’ovat tak napˇr. cˇ as nejrychleji zajetého kola, rychlost nebo umístˇení jednotlivých závodníku. ˚ Pro úˇcely své bakaláˇrské práce jsem testoval pouze editaci dráhy, protože ostatní cˇ ásti programu nelze porovnávat s ostatními aplikacemi díky spolupráci s fyzicky existujícím modelem. Abychom mohli zaˇcít stavˇet model, musíme nejprve vybrat výrobce, s jehož díly budeme pracovat. Na výbˇer máme ze 13 výrobcu˚ a každý z nich nabízí alesponˇ dvou- a cˇ tyˇr-dráhové díly, vˇetšina i díly s více dráhami. Po zvolení výrobce se zobrazí prázdná pracovní plocha a v levé cˇ ásti okna nabídka dílu, ˚ ze kterých mužeme ˚ stavˇet trat’. Vložení dílu se provede po kliknutí na jeho náhled a smˇer zatáˇcky se urˇcí podle oblasti náhledu, ve které došlo ke kliknutí, tedy levotoˇcivá zatáˇcka je vložena po kliknutí v levé polovinˇe náhledu. Pokud není vybraný žádný díl na pracovní ploše, vloží se nový dílek do stˇredu plochy, jinak je pˇripojen k právˇe vybranému dílu. Pokud vybereme dílek uprostˇred trati a vložíme nový, aplikace vmˇestná nový dílek mezi ostatní a tím posune okolní dílky. Posun dílku˚ funguje stejnˇe jako u aplikace Scalextric Track Designer, ale díky 2D zobrazení nabízí Ultimate Racer i výbˇer pomocí myší taženého obdélníku. Ultimate Racer disponuje funkcí, která po aktivaci vyrovná nepˇresnosti vzniklé pˇri stavbˇe a uzavˇre okruh. Kladnˇe hodnotím pˇrístup, který nevyžaduje manipulaci s modelem ze strany uživatele. Velmi dobˇre je vyˇrešena i otázka rozšíˇrení databáze, kdy program nabízí pˇrehledné okno pro editaci databáze nebo pro pˇridávání nových výrobcu˚ a dílu. ˚ Kromˇe bˇežných funkcí v podobˇe tiskového výstupu a zobrazení použitých dílu˚ je možné si prohlédnout trat’ v 3D zobrazení, které odhalí, že 2D pohled je vyˇrešený stejným zpusobem ˚ jako u aplikace firmy Scalextric, tedy kamerou nad trojrozmˇernou scénou. Mezi nedostatky této aplikace patˇrí absence funkce, která by manipulovala s výškou trati a zejména v praxi nepoužitelné funkce Zpˇet a Znovu. Jejich použití totiž zpusobí ˚ pˇresunutí kamery do levého horního, nebo pravého dolního rohu pracovní plochy, což vede k dezorientaci uživatele a ná8
2. S ROVNÁNÍ EXISTUJÍCÍCH PROGRAM U˚ sledné vracení se do puvodního ˚ místa zpusobuje ˚ zdržení. Pˇriblížení zobrazení pracovní plochy není vyˇrešené pˇríliš dobˇre, protože postupné zvˇetšování obrazu zpusobuje ˚ pˇribližování pohledu do stˇredu scény. Pokud tedy uživatel nestaví dráhu v blízkém okolí stˇredu scény, musí po každém pˇriblížení nebo oddálení pohledu posouvat kameru na správné místo. Editace dráhy v programu Ultimate Racer je snadná, ale zmínˇené nedostatky znepˇríjemnují ˇ nebo zpomalují práci uživatele. Pokud by funkce Zpˇet a Znovu fungovaly bez popsaných problému, ˚ byl by program Ultimate Racer dobˇre použitelným softwarem pro editování modelu˚ autodráhy.
2.5
XTrkCAD
Jediným zástupcem editoru˚ pro UNIXové systémy je XTrkCAD, program puvodnˇ ˚ e vyvinutý firmou Sillub Technology a dále udržovaný dvˇema vývojáˇri. Testování byla podrobena verze 4.02. Po spuštˇení uživatele pˇrivítá prázdná pracovní plocha, nabídka trat’ových dílu˚ nad pracovní plochou a okno „Tip dne“, které muže ˚ nováˇckum ˚ pomoci s ovládáním programu, aniž by museli otevˇrít nápovˇedu. Vkládání dílu˚ na plochu funguje v porovnání s ostatními aplikacemi na mírnˇe odlišném principu. Uživatel si v nabídce vybere díl, se kterým chce pracovat, kliknutím do scény vloží díl „naneˇcisto“, pˇrípadnˇe ho posune nebo otoˇcí a mezerníkem potvrdí vložení. V nabídce zustává ˚ díl vybraný a mužeme ˚ ho tedy znovu vložit stejným zpusobem. ˚ Tato technika je pˇrínosná v pˇrípadˇe, že uživatel bude vkládat delší sekvenci stejných dílu. ˚ Pro výbˇer mezi levotoˇcivou a pravotoˇcivou zatáˇckou je nutné otevˇrít okno Turnout z menu Add a vybrat správný koncový bod dílu. Tím se zvolí smˇer zatáˇcky. Pˇri testování jsem narazil na nedostatek funkce Zpˇet, jejíž použití zpusobí ˚ zavˇrení okna Turnout. Manipulace s modelem v podobˇe otáˇcení cˇ i posunu dílu˚ je k dispozici, nicménˇe ovládání tˇechto funkcí je vyˇrešeno zpusobem, ˚ který je v nˇekterých situacích zbyteˇcnˇe komplikovaný. Nejprve je nutné zapnout režim pro vybírání dílu, ˚ poté zapnout režim pro napˇr. posun vybraných dílu˚ a následnˇe je možné s díly manipulovat. Po uvolnˇení tlaˇcítka myši se oba režimy automaticky vypnou, tudíž pokud uživatel potˇrebuje posunout s jiným úsekem trati, je nutné všechny kroky absolvovat znovu. I tato aplikace dává uživateli možnost nastavit výšku v jednotlivých bodech trati. Uživatel muže ˚ pro každý bod spojení dvou dílu˚ nastavit bud’ výšku manuálnˇe, výšku podle nejbližších sousedu, ˚ nebo stoupání podle nejbližších sousedu. ˚ 9
2. S ROVNÁNÍ EXISTUJÍCÍCH PROGRAM U˚ Konkurenˇcní výhodou v porovnání s ostatními aplikacemi je možnost vedení databáze souprav, které se budou pohybovat po vystavˇené trati. Program umožnuje ˇ i sestavení soupravy pˇrímo na trati a následnou simulaci provozu. Pokud uživatel vyšle soupravy proti sobˇe, dojde sice ke stˇretu, ale poté se soupravy spojí a pokraˇcují ve smˇeru rychlejší soupravy. XTrkCAD je dobrý program, ale rˇ adu funkcí je nutné nejprve vyzkoušet podle nápovˇedy, což muže ˚ cˇ ást uživatelu˚ nováˇcku˚ odradit od dalšího používání. Po osvojení si základu˚ ovládání se s programem pracuje dobˇre, ale jiné programy, které jsem také testoval, se ovládaly snáze a rychleji.
10
3 Funkcionalita vlastního programu Na základˇe výsledku˚ testování dostupných programu˚ a zadání tématu bakaláˇrské práce jsem sestavil seznam požadované funkcionality. Existující programy ovlivnily zejména scénáˇre provedení jednotlivých úkonu˚ a to, jakým zpusobem ˚ je do procesu zapojen uživatel. Mezi funkce, které nesmˇejí chybˇet v žádném editoru podobného zamˇerˇ ení, se rˇ adí vkládání dílu, ˚ jejich mazání a dále pak prostˇredky pro základní manipulaci s modelem, jako je posun cˇ i otáˇcení. S posunem souvisí i spojování modelových cˇ ástí, jelikož v pˇrípadˇe, kdy uživatel posune dvˇe cˇ ásti modelu dostateˇcnˇe blízko k sobˇe, z nich program vytvoˇrí jeden souvislý úsek trati. Pˇri práci s programem XTrkCAD, mˇe rušil zpusob ˚ práce s režimy kvuli ˚ jejich množství a nutnosti opˇetovné aktivace pˇred každým použitím. Z tohoto duvodu ˚ jsem svuj ˚ program navrhl tak, aby obsahoval podobných režimu˚ co nejménˇe a vypnutí cˇ i pˇrepínání režimu˚ jsem nechal na uživateli. Model lze stavˇet ve dvou režimech. Ihned po spuštˇení je aktivovaný režim editace bez omezení množství dílku, ˚ ale program muže ˚ být pˇrepnut i do režimu, ve kterém je k dispozici pouze tolik kusu˚ každého dílku, kolik si uživatel nastaví. Program dává uživateli možnost zohlednit v modelu výškovou strukturu terénu, do kterého bude model fyzicky umístˇen. Pˇri práci se železniˇcní tratí je možné specifikovat výšku v konkrétních koncových bodech každého dílku, pˇri stavbˇe autodráhy je navíc k dispozici automatická úprava výšky koncových bodu˚ na základˇe podélného nebo boˇcního pˇrevýšení, které uživatel zadá. Pˇri stavbˇe rozsáhlejších modelu˚ se muže ˚ snadno stát, že se nepodaˇrí vytvoˇrit trat’, jejíž díly na sebe budou naprosto pˇresnˇe navazovat. V takové situaci muže ˚ modeláˇr pˇristoupit k mírnému ohnutí trati a docílí tak pˇripojení obou cˇ ástí modelu. Stejné rˇ ešení nabízí i mnou vytvoˇrený program. Mezi další funkcionalitu aplikace patˇrí automatické doplnˇení modelu vhodnými dílky. Uživatel má tuto funkci k dispozici v omezeném i neomezeném režimu editace, nicménˇe lepší výsledky vykazuje v neomezeném režimu, kdy je k dispozici dostateˇcné množství všech dílu. ˚ Souˇcástí programu je i knihovna dílu, ˚ která je realizována formou textového souboru. Uživatel tak má možnost rozšíˇrit databázi o nabídku dalších výrobcu. ˚ Každý údaj, dle kterého je následnˇe vygenerovaná souˇcástka, je navíc výstižnˇe pojmenován, což rozšíˇrení knihovny ještˇe více usnadnuje. ˇ Kromˇe kolejových dílu˚ program podporuje také ruzné ˚ druhy vegetace, které 11
3. F UNKCIONALITA VLASTNÍHO PROGRAMU zkrášlí okolí modelu, a v pˇrípadˇe autodráhy ještˇe navíc díly se svodidly a krajnicí. Cílem bylo vyvarovat se problému, ˚ které komplikovaly cˇ i znepˇríjemnovaly ˇ práci s jinými programy a vytvoˇrit program, který se dobˇre ovládá a v porovnání s konkurenˇcním softwarem nabízí i jistou cˇ ást funkcionality navíc.
12
4 Použité technologie Pˇred zapoˇcetím vývoje aplikace bylo nutné zvolit programovací jazyk a toolkit (sada knihoven a softwarových nástroju), ˚ který použiji. Jelikož má aplikace primárnˇe fungovat na UNIXových operaˇcních systémech, nabízí se možnost použití toolkitu GTK+, jenž byl vyvinut primárnˇe pro tuto platformu. Možnou alternativou je pak toolkit Qt. Qt je nativnˇe vytvoˇren pro jazyk C++, GTK+ pro jazyk C, ale oba toolkity jsou k dispozici i pro rˇ adu jiných programovacích jazyku, ˚ napˇr. pro Python, Javu nebo PHP. Pˇri srovnání množství kódu, který je tˇreba napsat pro stejné aplikace, je lepší volbou Qt, ale GTKmm, což je rozhraní nad GTK+ pˇrizpusobené ˚ jazyku C++, tento rozdíl minimalizuje. GTK+ i GTKmm jsou zamˇerˇ eny spíše na práci s grafickým uživatelským rozhraním, naproti tomu Qt je rozsáhlejší – jeho pˇrímou souˇcástí jsou i datové kontejnery, tˇrídy pro práci se soubory, s vektorovou i bitmapovou grafikou, OpenGl a mnohé další. Pˇri použití GTK+ i GTKmm je tedy nutné zahrnout do projektu i další knihovny zajišt’ující potˇrebnou funkcionalitu, napˇr. cairo cˇ i cairomm pro 2D grafiku. GTK+, GTKmm i Qt obsahují i vestavˇené mechanismy pro správu pamˇeti. Pro GTK+ i GTKmm je k dispozici aplikace pro tvorbu uživatelských rozhraní – Glade [10]. Qt muže ˚ být pˇri vývoji používáno s programem Qt Creator (je souˇcástí toolkitu Qt), v nˇemž lze navíc zkompilovat a spustit aplikaci v režimu ladˇení. Mužeme ˚ tedy využít nástroj, v nˇemž vlastní aplikaci naprogramujeme, navrhneme její grafické rozhraní a následnˇe ji za pomoci pˇrehledného rozhraní odladíme. GTK+ a GTKmm nabízí nastavení ruzných ˚ ladicích pˇríznaku˚ pˇri kompilaci, cˇ ímž se zajistí kontrolní výpisy na ruzných ˚ úrovních detailu. ˚ Samozˇrejmˇe je možné použít i bˇežné ladicí nástroje jako napˇr. GDB. Pˇrestože je GTK+ objektovˇe orientované, nebylo by jeho použití pˇríliš výhodné. Pokud by program Rail & Slot Editor byl napsán v C++, je výhodnˇejší použít GTKmm, pokud bych zvolil jazyk C, byla by komplikovanˇejší implementace programu díky absenci pˇrímé podpory objektovˇe orientovaného programování v C. Ve srovnání s GTKmm se mi jako vhodnˇejší jeví Qt díky pokrytí všech oblastí, které v programu využiji, a tedy i konzistentnímu rˇ ešení drtivé vˇetšiny problému˚ a pˇrehledné hierarchii tˇríd. V ostatních aspektech, jako napˇr. základní nabídka widgetu˚ (komponent grafického rozhraní), kvalita dokumentace, cˇ i „vyjadˇrovací síla“, jsou oba toolkity na stejné úrovni.
13
4. P OUŽITÉ TECHNOLOGIE Jak již bylo zmínˇeno, Qt je k dispozici v ruzných ˚ programovacích jazycích. Vybíral jsem mezi C++, v nˇemž je Qt puvodnˇ ˚ e vytvoˇreno, a interpretovaným jazykem Python, jakožto zástupcem z rˇ ad moderních jazyku. ˚ Qt pro jazyk Python se jmenuje PyQt. Oba jazyky podporují objektovˇe orientované programování a pamˇet’ová nároˇcnost stejných algoritmu˚ je zpravidla podobná, ale C++ vykazuje lepší výsledky [12]. Vzhledem k výpoˇcetní kapacitˇe souˇcasných procesoru˚ a absenci velmi nároˇcných výpoˇctu˚ v mé aplikaci nemá pˇríliš velký smysl srovnávat zmínˇené jazyky na základˇe rychlosti bˇehu programu, nicménˇe programy psané v C++ obvykle bˇeží rychleji, ale rozdíly nebývají velké [13] [14]. Python vyžaduje dodržování odsazení kódu, které je využito napˇr. k urcˇ ení rozsahu˚ platnosti. Díky tomu je kód cˇ asto cˇ itelnˇejší, ale také kratší vzhledem k tomu, že se nepoužívají složené závorky jako v jiných programovacích jazycích. V Pythonu se neuvádí datové typy promˇenných, a protože Python je první programovací jazyk, u kterého jsem se s touto vlastností setkal, pusobil ˚ na mˇe kód programu pomˇernˇe nepˇrehlednˇe. V jazyce C++ jsem postrádal prostˇredky pro automatickou správu pamˇeti, ale s využitím programu Valgrind je možné se výskytu tzv. memory leaks (promˇenné alokované na haldˇe, na které nemáme ukazatel cˇ i odkaz a nelze je tedy uvolnit) vyvarovat a alokovanou pamˇet’ rˇ ádnˇe uvolnit. Pˇred koneˇcným rozhodnutím jsem si vyzkoušel vytváˇrení grafického rozhraní s využitím PyQt a porovnával výsledné programy s jejich ekvivalenty psanými v C++. Odhalil jsem drobné rozdíly a zjistil, že na Linuxu vypadají lépe a více pˇrirozenˇe programy v jazyce C++, tedy programy využívající Qt. Na základˇe získaných poznatku, ˚ a také v zájmu snazšího zajištˇení udržovatelnosti a rozšiˇritelnosti programu, jsem nakonec zvolil jazyk C++. Pokud z používání programu skuteˇcnými uživateli vyplynou nˇejaké požadavky na rozšíˇrení, bude pro mˇe, vzhledem k nˇekterým vlastnostem jazyka Python a toolkitu PyQt, snazší doplnit do programu požadovanou funkcionalitu. Toto rozhodnutí nemá žádný vliv na uživatele systému˚ typu UNIX, uživatelum ˚ pracujícím se systémem Windows pak pˇrinese nepatrnou výhodu v tom, že není nutné instalovat kromˇe PyQt a mé aplikace i interpret jazyka Python.
14
5 Poˇcátky vývoje programu Po uˇcinˇení rozhodnutí týkajícího se výbˇeru technologií, které využiji pˇri programování, bylo tˇreba se nauˇcit základy práce s Qt, zejména pak s cˇ ástmi, které zajišt’ují grafické rozhraní a jeho interaktivitu. V tomto mi bylo nápomocné množství návodu˚ z ruzných ˚ zdroju, ˚ nicménˇe za nejvíce užiteˇcné považuji knihu „C++ GUI programming with Qt 4” [11] a oficiální stránky Qt www.qt-project.org, kde je k dispozici kvalitní dokumentace, rˇ ada návodu˚ jak vytvoˇrit jednoduché aplikace, ale také rozsáhlé diskuzní fórum, které obsahuje množství cenných rad a rˇ ešení ruznorodých ˚ problému. ˚ Vzhled uživatelského rozhraní a scénáˇre jednotlivých úkolu, ˚ které budou uživatelé provádˇet, byly sestaveny tak, aby používání programu bylo intuitivní a snadné. Nejdˇríve pˇrišly na rˇ adu papírové prototypy a skicy, které byly upravovány a konzultovány s vedoucím železniˇcního oddílu modeláˇrského kroužku v Domu dˇetí a mládeže Znojmo. V pozdˇejších fázích vývoje s ním byla prodiskutována i cˇ ást funkcionality, která zajišt’uje práci s modelem železnice, napˇr. flexibilita trati cˇ i zohlednˇení výšky terénu. Skici, které byly vytvoˇreny, jsou v pˇríloze A.
15
6 Elementy uživatelského rozhraní Uživatel bude pˇri své práci s programem potˇrebovat nˇekolik základních prvku˚ rozhraní. V horní cˇ ásti základního okna programu nalezneme hlavní menu a panel nástroju, ˚ jejichž prostˇrednictvím lze využít témˇerˇ kompletní funkcionalitu aplikace. Na levé stranˇe okna je umístˇen boˇcní panel, v nˇemž se zobrazuje nabídka modelových dílu˚ vybraných výrobcu. ˚ Nejvˇetší cˇ ást okna je vyhrazena pracovní ploše, na které uživatel staví svuj ˚ model.
6.1
Tˇrídy Application a Window
Pˇri vytváˇrení programu s použitím Qt hraje klíˇcovou roli tˇrída QApplication, která zprostˇredkovává správu pamˇeti všech ostatních prvku˚ rozhraní, pˇri spuštˇení programu zjistí uživatelské nastavení systému nebo písma používaná v rozhraní zbytku systému. Zajišt’uje interaktivitu rozhraní pomocí vyvolání událostí, ale také má pˇrehled o všech oknech našeho programu. Tˇrída Application je potomkem tˇrídy QApplication, ke které pˇridává nˇekolik atributu. ˚ Kromˇe hlavního okna, tedy instance tˇrídy Window, a dvou dialogových oken, která jsou rozebrána v kapitole Doplnkové ˇ prvky grafického rozhraní, obsahuje zejména ukazatele na instance tˇríd Preferences a AppData. Dále do tˇrídy Application patˇrí atributy umožnující ˇ pˇrepínání omezeného režimu editace a povolení spojovat v jednom modelu díly od ruzných ˚ výrobcu. ˚ V metodˇe setupUI() dochází k inicializaci celého uživatelského rozhraní, k vytvoˇrení a naˇctení databáze výrobcu˚ a jejich nabídek modelových dílu, ˚ a k pˇriˇrazení tzv. slotu˚ k signálum. ˚ Mechanismus signálu˚ a slotu˚ je oblastí specifickou pro Qt a slouží ke komunikaci mezi objekty ruzných ˚ typu˚ (napˇr. tlaˇcítko a okno). Sloty jsou cˇ lenské metody tˇrídy a musí být uvozeny klíˇcovým slovem „slots“ (napˇr. public slots: následují hlaviˇcky metod), signály jsou metody, jejichž deklaracím pˇredchází klíˇcové slovo „signals“. Provedení metody, která je signálem, zpusobí ˚ zavolání metody, která je slotem, pˇriˇcemž signál je nejˇcastˇeji zavolán pˇri výskytu konkrétní události na grafickém rozhraní. Mezi sloty ve tˇrídˇe Application se rˇ adí metody pro práci se soubory a pro export informací o modelu do HTML souboru. QMainWindow je tˇrída, jejíž instance se používá jako hlavní okno programu a nabízí šablonu vzhledu, do níž mužeme ˚ umístit menu, panely nástroju, ˚ stavový rˇ ádek a centrální widget (widget: komponenta grafického rozhraní). Tˇrída Window je potomkem QMainWindow a ve svých atributech má uložené hlavní menu, panel nástroju, ˚ pracovní plochu, postranní pa16
6. E LEMENTY UŽIVATELSKÉHO ROZHRANÍ nel a základní kontextové menu, které je používané jinde než na pracovní ploše, nebo v postranním panelu.
6.2
Tˇrída WorkspaceWidget
Pracovní plocha, na níž uživatel vytváˇrí model a manipuluje s ním, je instance tˇrídy WorkspaceWidget. Ta je potomkem tˇrídy QGraphicsView, což je widget, jehož úkolem je umožnovat ˇ zobrazení obsahu grafické scény, tedy objektu typu QGraphicsScene. Ve tˇrídˇe pracovní plochy si program uchovává informace o momentálnˇe vybraném „aktivním bodˇe“ a „aktivním modelovém fragmentu“ (vysvˇetleno v kapitole Vložení nového dílu), obsahuje seznam aktuálnˇe vybraných dílku˚ a také dva seznamy pˇríkazu˚ - pomocí jedné sady byl model krok po kroku vytvoˇren, pomocí druhé se lze dostat až do poˇcáteˇcního stavu pracovní plochy. Zajišt’ují tedy funkce Zpˇet a Znovu bez omezení poˇctu kroku. ˚ Metody, které jsou implementovány v této tˇrídˇe zpravidla pouze sbírají data potˇrebná pro funkce Zpˇet a Znovu, a poté volají další metody, umožnující ˇ práci s modelem. Tím, jak práce s modelem probíhá, se zabývá kapitola Manipulace s modelem, proto zde uvedu pouhý výˇcet názvu˚ nejduležitˇ ˚ ejších metod tˇrídy a velmi krátký komentáˇr: •
commandExecution() - rozpoznání a provedení pˇríkazu˚ ze seznamu˚ pˇríkazu, ˚
•
pushBackCommand() - manipulace se seznamy pˇríkazu˚ makeItem(),
•
makeBorder() - vytvoˇrení modelového dílu cˇ i mantinelu,
•
makeLastItem() - opˇetovné vložení naposledy použitého dílu,
•
removeItem(),removeFragment() - smazání jednoho dílu cˇ i celého úseku trati,
•
connectFragments() - spojení dvou samostatných cˇ ástí modelu,
•
bendAndClose() - spojení dvou bodu˚ v modelu s využitím flexibility kolejového systému,
•
completeFragment() - automatizované dopoˇcítání trati mezi dvˇema vybranými body. 17
6. E LEMENTY UŽIVATELSKÉHO ROZHRANÍ
6.3
Tˇrída SideBarWidget
V levé cˇ ásti hlavního okna programu se nachází boˇcní panel, jehož úkolem je zprostˇredkovat uživateli možnost správy inventáˇre a vkládání dílu˚ na pracovní plochu. Tˇrída SideBarWidget, jejíž instance zastává funkci boˇcního panelu, dˇedí ze tˇrídy QFrame. Mezi funkcionalitu zajištˇenou tímto pˇredkem se rˇ adí napˇr. možnost pˇriˇradit widgetu tzv. layout, tedy mˇrížku, do níž se umist’ují další widgety. V této mˇrížce jsou umístˇena dvˇe tlaˇcítka, nástroj pro výbˇer výrobce a instance QGraphicsView, v níž se zobrazuje celá nabídka vybraného výrobce. Stisknutí jednoho z tlaˇcítek vyvolá dialogové okno, ve kterém si uživatel vybere výrobce, jehož díly si pˇreje zobrazit. Druhé tlaˇcítko vyvolává dialogové okno, ve kterém lze specifikovat výrobce, které chceme z nabídky odstranit. Odstranˇení zpusobí, ˚ že daný výrobce nebude uvedený ve výˇctu výrobcu˚ v boˇcním panelu, ale ponechá už vložené díly tohoto výrobce na pracovní ploše. Tˇrída SideBarWidget obsahuje zejména metody související s úpravou nabídky výrobcu, ˚ tedy inicializace a zobrazení dialogových oken a zpracování výsledku – tedy napˇr. pˇridání výrobce do nabídky.
6.4
Doplnkové ˇ prvky grafického rozhraní
Kromˇe už popsaných elementu˚ jsou pˇri bˇežné práci s programem cˇ asto používány i jiné prvky, pomocí kterých muže ˚ uživatel komunikovat s programem a naopak. Pˇri uložení cˇ i otevˇrení souboru s vymodelovanou tratí je používán vestavˇený dialog z Qt, konkrétnˇe QFileDialog, který dovoluje specifikovat povolené pˇrípony souboru˚ a jiná nastavení. Uživatel má možnost zobrazit si výˇcet použitých dílu˚ spolu s dalšími užiteˇcnými informacemi, které usnadnují ˇ stavbu skuteˇcného modelu nebo nákup potˇrebných dílu, ˚ v dialogovém oknˇe. To je vytvoˇreno za použití tˇríd QDialog, QFormLayout a QTreeView. Díky poslední zmínˇené tˇrídˇe jsou použité díly rˇ azeny do stromové struktury a uživatel má snadný pˇrístup k více úrovním detailu. ˚ Chybová hlášení se uživateli zobrazují v instanci tˇrídy QMessageBox, jež disponuje sadou ikon, které jsou v souladu s platformními zvyklostmi a grafickým stylem. Text hlášení je pak samozˇrejmˇe vypsán v jazyce, který má uživatel právˇe nastaven.
18
7 Reprezentace modelu v programu Moje aplikace podporuje díly ze tˇrí základních skupin – trat’ové díly, krajnice s mantinely pro autodráhu a díly znázornující ˇ vegetaci. Zvažoval jsem, zda by nebylo vhodnˇejší místo krajnic pracovat s obecnˇejším typem dílu, který by mohl být pˇridán i k železniˇcní trati, ale vzhledem k tomu, že jsem nenašel v nabídce výrobcu˚ vhodné díly, jsem od tohoto rˇ ešení upustil. Pro každou ze skupin dílu˚ je vyhrazena jedna tˇrída, pˇriˇcemž všechny tˇri mají spoleˇcného pˇredka – abstraktní tˇrídu GenericModelItem. Ta nese základní data, která musí obsahovat každý díl. Jde o cˇ eský a anglický popis dílu, cˇ íslo dílu, vektorový model, množství dílu, ˚ které je k dispozici v režimu s omezeným inventáˇrem a produktovou rˇ adu, do které díl náleží. Potomky GenericModelItem jsou tˇrídy ModelItem, BorderItem a VegetationItem, které pˇridávají funkcionalitu a data specifická pro danou skupinu dílu. ˚
7.1
Druhy dílu˚
Trat’ové díly mohou být železniˇcní cˇ i autodráhové, pˇriˇcemž platí, že jeden výrobce muže ˚ mít v nabídce díly právˇe jednoho typu. Pro urˇcení druhu dílu, at’ už autodráhového nebo železniˇcního, se používá výˇctový typ ItemType. Níže jsou uvedeny všechny druhy dílu, ˚ se kterými je možné v programu pracovat: •
zatáˇcka – je charakterizována polomˇerem kruhu a úhlem kruhové výseˇce,
•
rovný díl – má libovolnou délku a úhel je vždy roven nule,
•
výhybka – muže ˚ být levá nebo pravá, v pˇrípadˇe železnice i trojcestná, kˇrížová nebo s dvojitým kˇrížením,
•
kˇrížení dvou vˇetví trati pod urˇcitým úhlem.
Nabídka železniˇcních dílu˚ dále muže ˚ obsahovat: •
zakonˇcení trati s nárazníkem,
•
toˇcnu,
•
kolejovou pˇresuvnu s možností pˇripojit okolní díly ve 4 až 20 bodech.
Druhy autodráhových dílu˚ mohou být následující: 19
7. R EPREZENTACE MODELU V PROGRAMU •
zatáˇcka, rovný díl, výhybka, kˇrížení dvou vˇetví trati,
•
zatáˇcka s kˇrížením,
•
klopená zatáˇcka,
•
rovný díl se zúžením na obou stranách,
•
rovinka se zúžením – program rozlišuje jako samostatné díly rovinku se zúžením na levé, nebo na pravé stranˇe,
•
rovný díl s poˇcítadlem ujetých kol,
•
rovný díl s nájezdovou rampou na skok,
•
rovný díl s výmˇenou drah (pouze pˇrekˇrížené dráhy),
•
rovný díl s možností výmˇeny drah (možnost pokraˇcovat rovnˇe, nebo vymˇenit dráhy).
Pˇri výbˇeru dílu, ˚ které bude muj ˚ program podporovat, jsem se snažil vyˇ vážit množství druhu˚ podporovaných dílu˚ a univerzálnost použití. Rada výrobcu˚ nabízí stejný druh dílu, ale u každého výrobce je díl pojat jiným zpusobem. ˚ Trojcestná výhybka muže ˚ být symetrická cˇ i asymetrická a navíc každá z vˇetví muže ˚ mít jiný polomˇer oblouku i úhel kruhové výseˇce; pod pojmem „šikana“ najdeme v rˇ adˇe SCX Original, SCX Digital, Scalextric cˇ i Carrera velmi odlišné díly. Zamˇerˇ il jsem se tedy na možnost pracovat s díly ruzných ˚ výrobcu˚ a poskytnout takové druhy dílu, ˚ které umožní nahradit specifické díly kombinací jiných dílu, ˚ takže zmínˇenou šikanu je pak možné vystavˇet z nˇekolika dílu˚ jiného druhu. Vyhnu se tak situaci, kdy program podporuje desítky druhu˚ dílu, ˚ každý z nich se zadává do databáze odlišným zpusobem ˚ (což by ztˇežovalo rozšiˇrování databáze), ale rˇ adu z nich nabízí vždy pouze jeden výrobce. Díly uvedených typu˚ jsou organizovány do nabídek produktu˚ (tˇrída ProductLine), pˇriˇcemž platí, že každá nabídka obsahuje pouze díly jednoho mˇerˇ ítka. Pokud výrobce nabízí díly ve více mˇerˇ ítkách, je nutné, aby byly v databázovém souboru uvedeny oddˇelenˇe. Železniˇcní díly mohou být v mˇerˇ ítku G, L, O, S, OO, HO, TT, N, Z, ZZ nebo T, autodráhové díly v mˇerˇ ítku 1:24, 1:32, 1:43 a HO. Jiná mˇerˇ ítka nejsou podporována. Mˇerˇ ítka jsou v programu používána pro urˇcení, zda je možné k sobˇe dva díly cˇ i trat’ové segmenty pˇripojit. V pˇrípadˇe železnice je na základˇe mˇerˇ ítka vytvoˇrena i grafická reprezentace dílu. 20
7. R EPREZENTACE MODELU V PROGRAMU Kromˇe trat’ových dílu˚ je možné pracovat i s nekolejovými díly. K autodráhovým dílum ˚ lze pˇripojit díly s krajnicí a svodidlem. Díly krajnice mohou být urˇceny pro zatáˇcku a pro rovnou trat’. Krajnice pro zatáˇcku muže ˚ být vnitˇrní nebo vnˇejší a stejnˇe jako trat’ový díl je urˇcena svým polomˇerem a úhlem kruhové výseˇce. Rovná krajnice je dána svojí délkou a v databázi dílu˚ ji lze oznaˇcit jako ukonˇcovací díl. Potom je vytvoˇren mírnˇe odlišný vektorový model dílu. Na pracovní plochu lze také umístit modely znázornující ˇ stromy cˇ i keˇre. Tyto modely jsou specifikovány svými rozmˇery a roˇcním obdobím. Oba parametry ovlivnují ˇ vzhled modelu.
7.2
Grafická reprezentace dílu˚
Vektorové modely jednotlivých dílu˚ vychází ze tˇrídy QGraphicsPathItem. Funkcionalitu pˇredka rozšiˇruje nebo upravuje odvozená tˇrída GraphicsPathItem. Jejím úkolem je zajistit inicializaci kontextového menu a dialogu, ve kterém si uživatel muže ˚ nastavit dostupné množství daného dílu. Potomky GraphicsPathItem jsou tˇrídy GraphicsPathItemModelItem, GraphicsPathItemBorderItem a GraphicsPathItemVegetationItem, které zpracovávají události na uživatelském rozhraní a zajišt’ují správné vykreslení dílu. QGraphicsPathItem obsahuje pˇredpˇripravené funkce pro posun a výbˇer prvku˚ ve scénˇe. Funkce umožnující ˇ výbˇer je v programu použita, ale bylo zapotˇrebí mírnˇe upravit grafickou stránku vˇeci. Kolem vybraného prvku Qt standardnˇe vykresluje hraniˇcní obdélník, který nevypadá pˇríliš dobˇre, proto je nyní vybraný prvek zvýraznˇen zeleným obrysem (železniˇcní díly), nebo jinou barvou výplnˇe (ostatní díly). Vestavˇenou funkci pro posun jsem nepoužil, jelikož zmínˇení potomci jsou pouze nositeli vektorových modelu˚ a veškeré zmˇeny polohy, at’ už jde o posun nebo otáˇcení, je tˇreba provést i v entitách nesoucích informace o jednotlivých dílech cˇ i úsecích trati. Souˇcástí QGraphicsPathItem je i metoda type(), která vrací hodnoty výˇctové konstanty QGraphicsItem::Type. Ta je použita pro zajištˇení správného fungování ukládání a naˇcítání souboru˚ a funkcí Zpˇet a Znovu. Pˇri spuštˇení editoru se naˇcte knihovna dílu˚ v podobˇe textového souboru a z obsahu souboru se odvodí vzhled dílu. ˚ Podoba vektorového modelu je ovlivnˇena tím, jak je daný díl specifikován. V pˇrípadˇe železniˇcních trat’ových dílu˚ je vzhled ovlivnˇen mˇerˇ ítkem, urˇcujícím šíˇrku trati, druhem dílu, polomˇery oblouku˚ a úhlem kruhové výseˇce, cˇ i délkou rovných dílu. ˚ Vizuální stránka autodráhové trati je založena na stejném principu jako u železnice, ale navíc se bere v úvahu poˇcet drah a vzdálenost mezi nimi. Na21
7. R EPREZENTACE MODELU V PROGRAMU stavení výšky v jednotlivých bodech nijak neovlivnuje ˇ vykreslení modelu. Na základˇe schopností a výkonu modelových lokomotiv a autodráhových vozidel se pˇredpokládá, že v rámci jednoho dílu nebude pˇrevýšení natolik výrazné, že by bylo nutné díl zkrátit a zohlednit tak pˇrevýšení. Díly krajnice pro autodráhu svým vzhledem znázornují ˇ písˇcitou krajnici a obrubník u okraje trati a podobnˇe jako u trat’ových dílu˚ se na vzhledu podílí úhel a polomˇer zatáˇcky cˇ i délka rovného dílu. Vektorový model vegetace je vytvoˇren tak, aby pˇripomínal korunu stromu, jejíž rozmˇery jsou specifikovány v databázi dílu. ˚ Barva výplnˇe je urˇcena roˇcním obdobím, které je nastaveno u konkrétního dílu.
7.3
Tˇrída ModelItem
Trat’ové díly autodráhy i železnice jsou v programu zastoupeny instancemi tˇrídy ModelItem. Ta rozšiˇruje svého pˇredka o data potˇrebná k práci s díly a pˇridává rˇ adu funkcí umožnujících ˇ manipulaci s díly. Každý díl si nese informaci o svém typu, což je hodnota výˇctového typu ItemType, a o svých polomˇerech cˇ i rozmˇerech, pro nˇež jsou k dispozici dva atributy. Pokud se jedná o zatáˇcku pro železnici, používá se pouze jeden z nich, druhý je roven nule, v pˇrípadˇe autodráhy se používají oba a je v nich uložen vnˇejší a vnitˇrní polomˇer oblouku. Rovné železniˇcní díly používají pouze jeden atribut vyjadˇrující polovinu délky dílu. Autodráhové rovné díly používají opˇet oba, pˇriˇcemž v jednom z nich je uložena polovina délky dílu a v druhém šíˇrka dílu. Výhybky mohou využívat oba atributy pro vyjádˇrení polomˇeru˚ oblouku˚ svých jednotlivých vˇetví. V pˇrípadˇe, že se jedná o levotoˇcivý díl libovolného typu, jsou hodnoty polomˇeru˚ záporným cˇ íslem. Duležitou ˚ charakteristikou trat’ových dílu˚ jsou koncové body, ve kterých je možné pˇripojit jiné díly. Každý koncový bod je vyjádˇren svými sourˇ adnicemi, úhlem natoˇcení, sousedním dílem, který muže ˚ být v bodˇe pˇripojen, výškou v bodˇe a vektorovým modelem ukazujícím aktuální výšku. Pokud díl nemá žádného souseda ve svém poˇcáteˇcním bodˇe, nebo v bodˇe který pˇri neutrálním natoˇcení dílu (takové, kdy je celý díl, nebo v pˇrípadˇe výhybek alesponˇ jedna vˇetev, symetrický podle osy y) smˇerˇ uje doleva, je daný úhel upraven o 180°, aby díly vložené v tˇechto bodech smˇerˇ ovaly opaˇcným smˇerem. Tato úprava je provedena pˇri vkládání dílu na pracovní plochu. Tˇrída ModelItem také rˇ ídí vytváˇrení vektorového modelu na základˇe informací o dílu a implementuje virtuální metody svého pˇredka – rotate() 22
7. R EPREZENTACE MODELU V PROGRAMU a moveBy(). Tyto metody aplikují transformaci na vektorový model a následnˇe upraví hodnoty souˇradnic a úhlu˚ v koncových bodech. Pˇri práci s modelem muže ˚ dojít k potˇrebˇe zohlednit pružnost kolejového systému. V programu je vyjádˇrena konstantou, která je ovlivnˇena délkou oblouku daného dílu. V pˇrípadˇe rovných železniˇcních a všech autodráhových dílu˚ je tato hodnota dále snížena, aby flexibilita trati co nejlépe odpovídala skuteˇcnosti. Pˇrestože mají autodráha i železniˇcní trat’ rˇ adu rysu˚ spoleˇcných, najdeme i nˇekolik odlišností. Trat’ autodráhového okruhu velmi cˇ asto vede více dráhami, pˇri úpravách výšky trati pak mužeme ˚ s jednotlivými díly manipulovat ve více bodech a témˇerˇ vždy je možné pˇripojit svodidla cˇ i díly s krajnicí a mantinelem. Každý trat’ový díl má mezi svými atributy ukazatel, který má v pˇrípadˇe železnice hodnotu NULL, v pˇrípadˇe autodráhy ukazuje na instanci tˇrídy SlotTrackInfo. Jedná se o pomocnou tˇrídu, v níž jsou uloženy informace o poˇctu drah, vzdálenosti mezi dvˇema dráhami, vzdálenosti první dráhy od vnˇejšího okraje dílu a informace o bodech, v nichž je možné pˇripojit mantinely (seznam souˇradnic, grafických prvku˚ a ukazatelu˚ na pˇripojené mantinely).
7.4
Tˇrída ModelFragment
Tˇrída ModelFragment je využívána pouze trat’ovými díly. Každá instance zastupuje jeden souvislý úsek trati, pˇriˇcemž nemusí jít o uzavˇrený okruh. Hlavním duvodem ˚ pro použití tˇrídy, která by mohla díly seskupovat, je jednodušší identifikace dílu˚ na pracovní ploše, urychlení vkládání nových dílu˚ a možnost výpisu informací o modelu v pˇrehledné formˇe. Každý úsek trati má svoje identifikaˇcní cˇ íslo, které je využíváno funkcemi Zpˇet, Znovu a pˇri naˇcítání ze souboru. V kombinaci s pozicí vektorového modelu ve scénˇe se tak dá snadno a rychle (vyhledávání prvku˚ v QGraphicsScene má logaritmickou cˇ asovou složitost) urˇcit, se kterým dílem se bude manipulovat. Mimo to si každá instance tˇrídy ModelFragment udržuje seznam dílu, ˚ ze kterých je úsek trati složen, a seznam koncových bodu, ˚ v nichž je možné pˇripojit další díly. K informacím o koncových bodech patˇrí souˇradnice bodu a úhel v bodˇe, grafický prvek koncového bodu a také díl, který se v daném bodˇe nachází. Vždy platí, že z poˇcáteˇcního dílu, tedy dílu, ze kterého byl 23
7. R EPREZENTACE MODELU V PROGRAMU úsek vytvoˇren, se lze dostat do všech koncových bodu˚ „po smˇeru dílu“ ˚ 1. Cest do koncových bodu˚ muže ˚ být více. Nejduležitˇ ˚ ejšími metodami jsou moveBy(), rotate(), addFragmentItem() a deleteFragmentItem(). První dvˇe zmínˇené jsou volány pˇri tažení vektorového modelu po scénˇe a zajišt’ují provedení transformace na všech dílech, které patˇrí do jednoho úseku trati. Metoda addFragmentItem() pˇridá k úseku trati díl, který je jejím argumentem, zatímco poslední zmínˇená provede smazání dílu. Poslední zásadní vˇecí, kterou obstarává ModelFragment, je výpis informací o úseku trati. Uživatel si muže ˚ pomocí kontextového menu vyvolat dialogové okno, v nˇemž se zobrazí celkový poˇcet dílu˚ použitých na tento úsek, pˇribližné rozmˇery a seznam použitých dílu˚ ve formátu „Nx ABC (DEF)“ , kde N je množství kusu, ˚ ABC je cˇ íslo dílu a DEF název výrobce. V posledním políˇcku okna je uvedený seznam výrobcu, ˚ z jejichž dílu˚ je daný úsek trati vystavˇen a názvy výrobcu˚ jsou doplnˇeny celkovým poˇctem použitých dílu˚ z jejich nabídky.
7.5
Tˇrídy pro nekolejové díly
Nekolejové díly nebývají v modelech zastoupeny v tak hojném poˇctu, ale dotváˇrí dojem z modelové trati. Tyto druhy dílu˚ jsou mým programem taktéž podporovány. Díly znázornující ˇ krajnici s obrubníkem a mantinely zastupuje tˇrída BorderItem, jež je potomkem GenericModelItem. K práci s tímto druhem dílu˚ je zapotˇrebí znát polomˇer oblouku nebo délku rovného mantinelu, úhel kruhové výseˇce, pˇríznak, zda se jedná o vnˇejší cˇ i vnitˇrní mantinel, seznam koncových bodu, ˚ v nichž je možné pˇripojit trat’ový díl a také samotné pˇripojené díly. Pˇrípojné body trat’ových dílu˚ i body samotných mantinelu˚ jsou generovány stejným zpusobem. ˚ Jejich poˇcet je ovlivnˇen úhlem zatáˇcky, nebo délkou rovného dílu. Na základˇe testování jiných programu˚ a podle dílu˚ výrobce SCX jsem stanovil, že body budou umístˇeny v intervalu 22.5°. V pˇrípadˇe rovných dílu˚ je umístˇení bodu˚ a jejich poˇcet ovlivnˇen délkou rovných dílu˚ v nabídce. Výrobce SCX i Scalextric nabízí rovné mantinely s délkou
1. Úsek trati pˇredstavuje orientovaný graf, jehož hrany zastupují díly a uzly grafu jsou koncové body jednotlivých dílu. ˚ Hrany jsou orientovány „po smˇeru dílu“, ˚ cˇ ímž se rozumí, že hrana zaˇcíná v bodˇe umístˇeném na levé stranˇe dílu, který je v neutrální pozici.
24
7. R EPREZENTACE MODELU V PROGRAMU rovnou polovinˇe délky nejdelšího rovného dílu. Nejdelší rovný díl daného výrobce má tedy k dispozici 2 pˇrípojné body na každé stranˇe. Tˇrída VegetationItem je urˇcena pro modely znázornující ˇ stromy cˇ i keˇre. Každý díl je urˇcen roˇcním obdobím a svými rozmˇery, výška stromu není brána v potaz. Stromy je možné otáˇcet a pohybovat s nimi po pracovní ploše, není možné je seskupovat a aplikovat transformace na skupinu stromu, ˚ ale je možné vybrat více modelu˚ najednou a pak transformaci provést.
7.6
Knihovna dílu˚
Pˇri testování už existujících programu˚ jsem zjistil, že s výjimkou dvou aplikací není vubec ˚ možné manipulovat s knihovnou dílu. ˚ SCARM používá jako databázi textové soubory pro jednotlivé výrobce, ale atributy konkrétních dílu˚ nejsou pojmenovány, což cˇ iní úpravu databáze složitˇejší a muže ˚ snadno sklouznout k metodˇe pokus-omyl. Program Ultimate Racer 3 disponuje propracovaným oknem, v nˇemž je možné editovat parametry existujících dílu˚ a pˇridávat nové díly i výrobce. Ve svém programu jsem zvolil kompromis mezi tˇemito pˇrístupy. Jako databáze slouží jeden textový soubor, ve kterém jsou obsaženy díly z nabídek všech výrobcu. ˚ Všechny parametry, které ovlivnují ˇ charakteristiku dílu, ˚ mají anglická pojmenování. Použité výrazy nepatˇrí mezi odbornou angliˇctinu, takže i uživatel s horší znalostí angliˇctiny by nemˇel mít výrazné problémy s editací. Knihovna souˇcástek má svoji strukturu, která musí být dodržena pro správné naˇctení dílu. ˚ Všechny díly jsou organizovány v produktových rˇ adách, pˇriˇcemž jedna produktová rˇ ada má díly jednoho mˇerˇ ítka, ale muže ˚ obsahovat zárovenˇ trat’ové díly i doplnkové ˇ modely. Databázový soubor se musí držet této kostry: rˇ ádek s i n f o r m a c í o kódování ( UTF−8 nebo ISO 8859 −2) [ [ [ l i b o v o l n ý název výrobce ] ] ] informace o v ý r o b c i [ [ Track ] ] s p e c i f i k a c e trat’ových d í l u˚ [ [ Accesories ] ] s p e c i f i k a c e d í l u˚ k r a j n i c e [ [ Vegetation ] ] s p e c i f i k a c e modelu˚ v e g e t a c e Tabulka 7.1: Kostra databázového souboru 25
7. R EPREZENTACE MODELU V PROGRAMU Není nutné dodržet poˇradí skupin dílu˚ ani specifikovat všechny díly jedné skupiny najednou (tzn. sekvence „...[[Track]] ...trat’ové díly... [[Accesories]] ...díly krajnice... [[Track]] ...další trat’ové díly...“ bude naˇctena korektnˇe), ale nelze specifikovat cˇ ást nabídky jednoho výrobce, pokraˇcovat jiným výrobcem a následnˇe doplnit další díly prvního výrobce. Formát, ve kterém se zadávají parametry samotných dílu, ˚ se mírnˇe liší v závislosti na druhu dílu. Na pˇriloženém obrázku je vyobrazena ukázka specifikace tˇrí druhu˚ dílu. ˚ Zleva je to pravá železniˇcní výhybka, rovný autodráhový díl a klopená zatáˇcka pro autodráhu. Na pˇriloženém CD se nachází soubor se vzorem pro vyplnˇení údaju˚ všech dostupných druhu˚ dílu. ˚
Obrázek 7.1: Ukázka specifikace tˇrí druhu˚ dílu˚ Pˇri spuštˇení programu se vytvoˇrí instance tˇrídy Database, což zpusobí ˚ naˇctení obsahu celé knihovny. Databáze obsahuje dvˇe struktury QMap, ve kterých jsou uloženy produktové rˇ ady a grafické scény pro boˇcní panel. Vyhledávání ve struktuˇre QMap má logaritmickou složitost vzhledem k poˇctu prvku˚ struktury. Vyhledává se podle názvu výrobce, nebo v pˇrípadˇe grafických scén podle kombinace mˇerˇ ítka a názvu výrobce. Knihovna se naˇcte vždy pˇri spuštˇení programu, poté už se nemˇení. Nacˇ tou se vždy všechny záznamy ze souboru a ty jsou následnˇe nabízeny uživateli. Ten si vybere, se kterými produktovými rˇ adami si pˇreje pracovat, tedy které mají být na výbˇer v boˇcním panelu.
26
8 Manipulace s modelem V následujících podkapitolách je vysvˇetleno fungování jednotlivých funkcí programu. Velká cˇ ást funkcí je vyvolána jako reakce na události uživatelského rozhraní, tzv. events. Mazání dílu, ˚ funkce Zpˇet a Znovu a metody zajišt’ující práci se soubory, tedy vytvoˇrení nového projektu, otevˇrení a uložení projektu a export obrázku jsou spouštˇeny pomocí dˇríve popsaného mechanismu slotu˚ a signálu. ˚
8.1
Vložení nového dílu
Vložení trat’ových dílu˚ je spuštˇeno podnˇetem z uživatelského rozhraní, tedy dvojitým kliknutí na díl v boˇcním panelu, nebo stiskem mezerníku. Následnˇe je zavolána metoda makeItem(), nebo makeLastItem(), obˇe patrˇ ící do tˇrídy WorkspaceWidget. Z tˇechto metod je volána funkce makeNewItem(), jejímž argumentem je pˇríslušný díl. Jejím úkolem je ovˇerˇ it dostupnost požadovaného dílu, pokud je aktivovaný režim s omezeným inventáˇrem, a následnˇe bud’ vložit nový díl do existujícího úseku trati, nebo založit nový úsek trati, který bude obsahovat vkládaný díl. Toto je rozhodnuto podle vybraného bodu na pracovní ploše. Jestliže je vybrán bod patˇrící do nˇekterého trat’ového úseku, je k nˇemu nový díl pˇripojen. Jestliže je vybrán bod, který do žádného trat’ového úseku nenáleží, pak je z nového dílu vytvoˇren nový úsek trati. Pˇri vložení dílu do trat’ového úseku je zapotˇrebí nejprve najít a odstranit bod úseku, ve kterém bude nový díl pˇripojen. Poté se provede posun a otocˇ ení dílu tak, aby navazoval na pˇredchozí díly. Dalším krokem je nastavení sousedství dílu˚ a úprava výšky nového dílu. Ta je odvozena od výšky sousedních dílu. ˚ V pˇrípadˇe železnice je výška ve všech bodech nového dílku nastavena na stejnou hodnotu, autodráhové díly jsou upravovány po jednotlivých drahách. Pokud má díl více než dva koncové body, je tˇreba ovˇerˇ it, zda na jeho „levé stranˇe“ (body na levé stranˇe dílu otoˇceného v neutrální poloze) nevzniknou body, v nichž díl nemá žádného souseda. V pˇrípadˇe, že by díl takové body obsahoval, je nutné úhly v nich upravit o 180°. Celý tento postup je provádˇen metodou addFragmentItem(), která je implementována ve tˇrídˇe ModelFragment. Pokud má vložením dílu vzniknout nový úsek trati, musí se ve funkci makeNewItem() upravit úhly vloženého dílu na levé, resp. „poˇcáteˇcní“ stranˇe (ta, kterou by byl dílek pˇripojen k existujícímu úseku trati). Tato úprava je nezbytná pro správnou funkˇcnost vkládání dalších dílu˚ na tuto stranu. Na27
8. M ANIPULACE S MODELEM víc se tak zachová význam levých a pravých dílu. ˚ Po této úpravˇe je zavolán konstruktor tˇrídy ModelFragment, jehož parametrem je novˇe vytvoˇrený díl. Skuteˇcná závodní trat’ pro autodráhu muže ˚ být složena z dílu˚ s ruzným ˚ poˇctem drah, at’ už jde o boxovou uliˇcku vedle cílové rovinky, nebo o dráhu znázornující ˇ napˇr. rallye, kdy se muže ˚ okruh rozdˇelit a každá vˇetev pak jde jiným smˇerem. Pro zachování možnosti stavby takovéto trati jsem ve vkládání dílu˚ nepoužil automatické zarovnání dílu, ˚ což má za dusledek ˚ už zmínˇenou nutnost vybírání bodu. ˚ Zvažoval jsem, zda bude program pˇri vkládání dílu˚ detekovat kolize s existující tratí, ale vzhledem k tomu, že je možné v programu pracovat s díly ruzných ˚ mˇerˇ ítek i s výškovým profilem, rozhodl jsem se detekci kolizí neimplementovat. U autodráhy je pˇrekážkou neznámá výška autíˇcka, u železnice jsou to rozdílné rozmˇery železniˇcního svršku, které se liší napˇr. podle použitého materiálu a sklonu podkladu. Samotný algoritmus by nebyl pˇríliš složitý na implementaci, ale zmínˇené odlišnosti by mohly vést ke zbyteˇcnému omezování uživatele, proto je rˇ ešení kolizí ponecháno na jeho úsudku. Autodráhu je možné doplnit o díly s krajnicí a mantinelem, jejichž vložení se spustí stejným zpusobem ˚ jako u trat’ových dílu. ˚ Každý autodráhový díl má po svém obvodu rozmístˇeny cˇ ervenˇe vyplnˇené kruhy znázornující ˇ body pro pˇripojení krajnice. Aby uživatel docílil vložení krajnice, musí nˇekterý z tˇechto bodu˚ vybrat, z cˇ ehož vyplývá i to, že krajnice nemuže ˚ být vložena na pracovní plochu samostatnˇe. Kromˇe toho platí, že každý díl krajnice smí být pˇripojen pouze k jednomu trat’ovému dílu, ale k trat’ovému dílu smí být pˇripojeno více dílu˚ krajnic. Vložení krajnice obstarává pˇretížená metoda makeItem(), jež volá funkci makeNewBorder(). Argumentem funkce je pˇríslušný díl krajnice. Po ovˇerˇ ení dostupnosti dílu se v metodˇe addBorder() tˇrídy SlotTrackInfo díl posune a otoˇcí do správné polohy a nastaví se atributy vyjadˇrující sousednost trat’ového dílu a dílu krajnice. Modely stromu˚ a jiné vegetace lze vložit stejným zpusobem ˚ jako ostatní díly, ale v tomto pˇrípadˇe není rozdíl mezi levou a pravou verzí. Stejnˇe jako u ostatních druhu˚ dílu˚ se zavolá pˇretížená metoda makeItem(), která zavolá funkci makeNewVegetation(). V této funkci se vytvoˇrí nová instance tˇrídy VegetationItem a posune se na požadovanou pozici.
28
8. M ANIPULACE S MODELEM
8.2
Posun a otáˇcení
Se všemi cˇ ástmi modelu, rozmístˇenými na pracovní ploše, je možné manipulovat. Program pracuje ve dvou režimech manipulace. Implicitnˇe je zapnutý režim posouvání, stiskem klávesy R nebo tlaˇcítka v lištˇe nástroju˚ se zapne režim otáˇcení. Ten je aktivní do opˇetovného stisku klávesy cˇ i tlaˇcítka. Pˇríslušné transformace zajišt’ují cˇ istˇe virtuální metody moveBy() a rotate() tˇrídy GenericModelItem, které implementují všechny tˇri tˇrídy modelových dílu. ˚ Transformace trat’ových dílu˚ probíhá tak, že uživatel stiskne levé tlacˇ ítko myši nad vektorovým modelem nˇekterého z dílu˚ a posunuje myší. Posun myši zavolá metodu obsluhující tuto událost a ta dále volá metodu moveBy() nebo rotate(). Podstatné je, že tato metoda není volána na konkrétním dílu, ale na celém úseku trati. Tato metoda tˇrídy ModelFragment se postará o transformaci všech dílu˚ daného úseku a upraví souˇradnice a úhly svých koncových bodu. ˚ Pˇrímá transformace jednotlivých dílu˚ se používá pouze pˇri vkládání dílu˚ a pˇri vyrovnání nepˇresností. Uživatel k ní nemá pˇrístup. Metody, které ji zajišt’ují, provedou transformaci vektorového modelu a upraví souˇradnice a úhly koncových bodu. ˚ Pokud jde o autodráhový díl a je k nˇemu pˇripojen díl krajnice, je na nˇej aplikována stejná transformace také. Poloha dílu˚ krajnice je upravována stejným zpusobem ˚ jako u trat’ových dílu, ˚ ale navíc je z metody obsluhující událost na rozhraní zavolána metoda transformující celý úsek trati, do kterého patˇrí díl pˇripojený ke krajnici. Transformace modelu˚ vegetace je velmi jednoduchá – staˇcí upravit polohu a natoˇcení vektorového modelu.
8.3
Odstranˇení dílu˚
Smazání dílu je provedeno po stisku klávesy Delete. S využitím mechanismu signálu˚ a slotu˚ je zavolána metoda removeItems() ze tˇrídy WorkspaceWidget, která smaže všechny aktuálnˇe vybrané díly na pracovní ploše bez ohledu na to, o který typ dílu˚ se jedná. Vymazání je zajištˇeno voláním metod removeItem(), removeBorder() a removeVegetation(). Všechny tˇri jsou cˇ leny tˇrídy WorkspaceWidget a jejich argumentem je vždy díl pˇríslušného typu. Odstranˇení trat’ových dílu˚ probíhá v nˇekolika krocích. Pokud bude odstranˇen díl autodráhy, provede se nejprve odstranˇení všech dílu˚ s mantinely, které je popsáno níže. Následnˇe se díl urˇcený k odstranˇení oddˇelí od svých sousedu. ˚ Pokud se tento díl nenachází na okrajích trati, jeho smazání by porušilo souvislost úseku. Proto je nutné vytvoˇrit více nových úseku˚ 29
8. M ANIPULACE S MODELEM trati a díly puvodního ˚ úseku mezi nˇe náležitˇe rozdˇelit. Vystavˇení nového úseku zaˇcíná vytvoˇrením nové instance ModelFragment. Ta se vytvoˇrí z prvního dílu, který nebude smazán a patˇrí do puvodního ˚ úseku. Poté algoritmus pokraˇcuje na principu prohledávání grafu do hloubky, kdy postupnˇe pˇridává do úseku trati dosud nepˇridané díly pomocí metody addFragmentItem(). Pokud má díl správný smˇer, je pˇridán, pokud je vzhledem k naposledy pˇridanému dílu v opaˇcném smˇeru, zamˇení se za totožný díl ve správném smˇeru. Ve chvíli, kdy už nelze žádný díl pˇridat, se vytvoˇrí nový úsek trati z prvního dílu, který ještˇe patˇrí do puvodního ˚ úseku trati a postup se opakuje. Tento proces výstavby trati probíhá ve funkci rebuildFragment(), která je využívána i algoritmem pro spojování samostatných trat’ových úseku. ˚ Posledním krokem je smazání požadovaných dílu. ˚ Protože funkce rebuildFragment() vytvoˇrila nové úseky trati z dílu, ˚ které mají v modelu zu˚ stat, je už puvodní ˚ instance tˇrídy ModelFragment nepotˇrebná. Provede se tedy vyprázdnˇení jejího seznamu dílu˚ a do seznamu se pak vloží všechny díly, které byly funkcí rebuildFragment() vymˇenˇeny a díl, který chtˇel uživatel smazat. Nakonec je dealokována pamˇet’ tohoto úseku trati, což zpusobí ˚ i dealokaci pamˇeti zmínˇených dílu. ˚ Odstranˇení dílu˚ s mantinely není tak komplikované a dˇeje se v metodˇe removeBorder() tˇrídy SlotTrackInfo. Spoˇcívá ve zrušení sousedství trat’ového dílu a krajnice. Následnˇe je odstranˇen vektorový model z pracovní plochy a dealokována pamˇet’. Modely znázornující ˇ vegetaci jsou smazány ve dvou krocích. Nejprve se odstraní vektorový model z pracovní plochy a poté je dealokována pamˇet’.
8.4
Spojování trat’ových úseku˚
Po provedení každé transformace úseku trati se ovˇerˇ í, zda je možné slouˇcit trat’ s jiným úsekem, který je poblíž. Toto ovˇerˇ ení i samotné spojení zajišt’uje metoda connectFragments(), která je cˇ lenem tˇrídy WorkspaceWidget. V pˇrípadˇe, že jsou dva úseky trati dostateˇcnˇe blízko v alesponˇ jednom ze svých koncových bodu, ˚ transformuje se jeden z úseku˚ tak, aby pˇresnˇe dosedl k druhé cˇ ásti trati. Následnˇe je nastaveno sousedství dílu, ˚ ve kterých budou úseky spojeny. V dalším kroku se z poˇcáteˇcního dílu jednoho z pu˚ vodních úseku˚ vytvoˇrí nový trat’ový úsek a je zavolána funkce rebuildFragment(), která je detailnˇeji popsána v pˇredchozí kapitole. Protože díly, ve kterých se trat’ spojila, mají správnˇe nastaveny své sousedy, naplní zmínˇená funkce nový úsek trati díly z obou puvodních ˚ cˇ ástí. Stejnˇe jako pˇri mazání 30
8. M ANIPULACE S MODELEM trat’ových dílu˚ jsou nyní puvodní ˚ instance tˇrídy ModelFragment naplnˇeny neplatnými daty, proto se do nich vloží díly, které byly vymˇenˇeny a následnˇe jsou obˇe instance smazány a dealokovány. Puvodním ˚ zámˇerem bylo vyhnout se použití funkce rebuildFragment(), protože v závislosti na smˇeru dílu˚ úseku˚ urˇcených ke spojení se muže ˚ stát, že jsou vymˇenˇeny díly celého jednoho úseku. V pˇrípadˇe rozsáhlých modelu˚ to muže ˚ znamenat výmˇenu desítek až stovek trat’ových dílu, ˚ ale ukázalo se, že tento krok je nutný k zajištˇení spolehlivosti spojování. Díky otáˇcení úhlu˚ na jedné stranˇe dílu (popsáno v kapitole Tˇrída ModelItem) spolu s možností mít v jednom úseku trati díly smˇerˇ ující ruznými ˚ smˇery, nebylo možné spolehlivˇe urˇcit, kdy se mají úhly na jedné stranˇe upravit. Použití funkce rebuildFragment() zajistí, že „levá strana“ každého dílu je vždy blíže k pocˇ áteˇcnímu dílu˚ než „pravá strana“. Jedinou výjimku tvoˇrí uzavˇrený okruh, ale i v nˇem existuje cesta, která tuto podmínku splnuje. ˇ
8.5
Výškový profil trati
Režim úpravy výšky trati dává uživateli možnost zasadit trat’ do podmínek, které odpovídají tomu, jak bude skuteˇcný model vystavˇen. V tomto režimu lze pouze upravovat výšku trati, nelze vkládat žádné nové díly. Tento mód se aktivuje, resp. deaktivuje po kliknutí na tlaˇcítko v panelu nástroju. ˚ Po aktivaci se na pracovní ploše zobrazí informace o výšce trati v každém koncovém bodˇe každého dílu v podobˇe modrého kruhu s cˇ íslem, které udává výšku bodu vyjádˇrenou v milimetrech. Samotná úprava výšky trati se mírnˇe liší v závislosti na tom, zda je upravována železnice cˇ i autodráha. Úprava výšky železniˇcní trati probíhá tak, že uživatel klikne na bod, v nˇemž si pˇreje výšku zmˇenit a poté v panelu nástroju˚ výšku v bodˇe snižuje, nebo zvyšuje. Takto provedené zmˇeny se promítnou do koncových bodu˚ obou dílu˚ sousedících v daném bodˇe. Pokud je editována výška rovného dílu, zakonˇcení trati s nárazníkem nebo zatáˇcky, provedou se zmˇeny pouze ve vybraném bodˇe. Díly všech ostatních druhu˚ jsou editovány tak, aby zu˚ staly v jedné rovinˇe, protože jde o díly, kde by se mohl projevit boˇcní sklon trati a modelová lokomotiva by pak nemusela zvládnout prujezd ˚ tímto dílem. Autodráha v porovnání se železnicí nabízí vˇetší prostor pro úpravy výšky. Jeden z duvod ˚ u˚ je ten, že autíˇcko je vedené pouze v úzké vodicí drážce, a nevadí mu tedy naklonˇené cˇ ásti trati. Muj ˚ program dovoluje tˇri ruzné ˚ druhy úprav výšky autodráhových dílu. ˚ Pˇri dvojitém kliknutí na díl nebo 31
8. M ANIPULACE S MODELEM na nˇekterý z jeho koncových bodu˚ se zobrazí dialogové okno, v nˇemž je možné nastavit si podélné stoupání nebo boˇcní náklon dílu. Oba údaje se zadávají v milimetrech a program po potvrzení údaju˚ automaticky spoˇcítá výšku v jednotlivých bodech. V pˇrípadˇe podélného stoupání je výška jen pˇriˇctena v koncových bodech, stranový náklon je z pˇrevýšení pˇreveden na úhel pomocí goniometrické funkce arkus sinus. Poté jsou využita data nacházející se v instanci tˇrídy SlotTrackInfo – poˇcet drah a vzdálenosti mezi nimi, díky kterým lze zjistit vzdálenost koncových bodu˚ od okraje dílu. Poslední možnost, jak upravit výšku autodráhy, je stejná jako v pˇrípadˇe železnice. Uživatel vybere jeden koncový bod a jeho výšku upravuje. Tento zpusob ˚ úprav nijak neovlivnuje ˇ okolní koncové body, tudíž je na uživateli, aby zejména u dílu˚ s více dráhami neopomíjel okolí bodu a adekvátnˇe je upravil. Pˇri aktivovaném režimu pro úpravu výšky trati je po kliknutí ovˇerˇ eno, zda uživatel kliknul poblíž nˇejakého koncového bodu. Pokud ano, jsou zavolány metody pro výbˇer dílu, pro nastavení aktivního dílu a aktivního bodu. Pro úpravu výšky ve vybraném bodˇe je tˇreba stisknout v panelu nástroju˚ tlaˇcítko pro zvýšení nebo snížení dílu. Kliknutí zpusobí ˚ provedení metody adjustHeightOfActive(), která je cˇ lenem tˇrídy WorkspaceWidget. V té je rozlišeno, zda uživatel kliknul na tlaˇcítko pro zvýšení cˇ i snížení a na základˇe toho je upravena výška aktivního dílu v aktivním bodˇe.
8.6
Vyrovnání nepˇresností trati
Kombinací dílu˚ o ruzných ˚ polomˇerech oblouku sice mužeme ˚ dobˇre napodobit skuteˇcné závodní tratˇe nebo železniˇcní koridory, ale také se pomˇernˇe snadno lze dostat do situace, kdy na sebe dva díly nebudou dokonale pˇresnˇe navazovat. Vzniklou situaci muže ˚ modeláˇr vyˇrešit mírným ohnutím trati tak, aby mohly být díly pˇripojeny k sobˇe. Muj ˚ program by tedy mˇel umˇet zohlednit pružnost kolejového systému. Pˇri vytváˇrení nové instance tˇrídy ModelItem se z úhlu kruhové výseˇce, polomˇeru oblouku a druhu trat’ového dílu odvodí hodnota, která je pˇri vyrovnání nepˇresností použita jako limit pro otoˇcení dílu. Limit pro posun dílu je 1 mm bez ohledu na charakteristiky dílu. Pˇri zvýšení tohoto limitu by mohlo docházet k rozpojení trati. Pružnost trati se implicitnˇe nepoužívá a díly jsou spojovány pˇresnˇe. Po kliknutí na tlaˇcítko v lištˇe nástroju˚ je uživatel vyzván k vybrání dvou bodu˚ trati, které si pˇreje spojit. Výbˇer druhého bodu zavolá jednu ze dvou pˇretížených metod bendAndClose(). Mezi jejich parametry patˇrí vybrané body 32
8. M ANIPULACE S MODELEM a jeden cˇ i dva úseky trati, na nichž se budou provádˇet zmˇeny. Obˇe metody používají odlišný pˇrístup k vyrovnání nepˇresností. V pˇrípadˇe, že je uzavírána trat’ v jednom trat’ovém úseku, se využije kruhové topologie trati, nebo alesponˇ cˇ ásti trati. Algoritmus pro uzavˇrení trati se skládá ze 4 cˇ ástí. Nejprve se projde celá trat’ pomocí prohledávání grafu do hloubky a vyhledá se cesta mezi uživatelem vybranými body. Pokud je souˇcástí cesty výhybka, poznaˇcí se vˇetev výhybky, kterou pokraˇcuje cesta k cíli. Nyní se nalezená cesta zaˇcne procházet podruhé a v každém navštíveném dílu se pˇriˇcte jeho úhel kruhové výseˇce. Algoritmus bˇeží, dokud není dosaženo celkového otoˇcení alesponˇ 76 stupnˇ u. ˚ Poznaˇcí se díl a bod, ve kterém bylo tohoto úhlu dosaženo. V tˇretí fázi se provádí rotace trat’ových dílu˚ následujících za poznaˇceným dílem. Úhel otoˇcení je vypoˇcten z kruhové výseˇce, jejíž polomˇer je roven vzdálenosti mezi aktuálnˇe zpracovávaným dílem a jedním z uživatelem vybraných bodu. ˚ Délka oblouku výseˇce je rovna vzdálenosti mezi obˇema vybranými body. Z tˇechto informací je vypoˇcten úhel otoˇcení, který je pˇrípadnˇe upraven tak, aby nepˇresahoval maximální povolený limit daného dílu. Následnˇe se na základˇe vzdáleností po transformaci vybere rotace o spoˇctený úhel v kladném nebo záporném smˇeru, nebo rotace o polovinu úhlu v kladném nebo záporném smˇeru. Tento výpoˇcet se opakuje ve všech zbývajících dílech na kruhové cestˇe, ale pokud se v poslední iteraci zvýšila vzdálenost v porovnání s pˇredposlední iterací, pokraˇcuje se dalším dílem. Toto omezení, spolu s výše zmínˇeným úhlem 76 stupnˇ u˚ vedlo k nejlepším výsledkum. ˚ Na závˇer se otoˇcí jeden z dílu˚ v uživatelem vybraných bodech tak, aby co nejlépe opticky navazoval na díl v druhém bodˇe, nastaví se sousednost tˇechto dílu˚ a odstraní se koncové body trat’ového úseku. Druhá metoda se použije, pokud uživatel vybere koncové body dvou trat’ových úseku. ˚ V této situaci nelze využít pˇrítomnost okruhu a tudíž je využit jiný algoritmus, který transformuje „nˇekolik“ dílu˚ v obou trat’ových úsecích. Vždy se použije nejvýše 5 dílu˚ z každého úseku, pokud nˇekterý z nich obsahuje dílu˚ ménˇe, použije se tento poˇcet. V obou trat’ových úsecích se upravuje stejný poˇcet dílu. ˚ Nejprve se zjistí, zda požadované ohnutí není pˇríliš velké a najdou se díly, ve kterých se zaˇcne s modifikací obou trat’ových úseku. ˚ Postupuje se smˇerem ke krajním dílum, ˚ k nimž patˇrí uživatelem vybrané body a modifikují se oba úseky najednou. Pro každý díl se spoˇcítá úhel otoˇcení jako hodnota potˇrebného ohnutí vydˇelená poˇctem dílu, ˚ kterých se transformace dotkne. Následnˇe se transformace provedou „naneˇcisto“ - upraví se kopie uživatelem vybraných bodu˚ a pro úpravu dílu˚ se použije taková kombinace transformací, po jejímž provedení budou vybrané body nejblíže. Díly se mohou ponechat v puvodním ˚ stavu, 33
8. M ANIPULACE S MODELEM otoˇcit v kladném nebo záporném smˇeru, posunout o 1 bod ve smˇeru vektoru (1,1) nebo (-1,-1), posunout a poté otoˇcit, nebo otoˇcit a poté posunout. V dalším kroku jsou transformace aplikovány na trat’ové díly. Posledními dvˇema kroky je otoˇcení jednoho z krajních dílu˚ tak, aby co nejlépe navazoval na druhý díl a zavolání metody connectFragments(), která oba úseky trati spojí do jednoho.
8.7
Automatické dopoˇcítání trati
Uživatel muže ˚ využít funkci, která doplní už existující trat’ dalšími díly a pokusí se doplnit je tak, aby se trat’ dala uzavˇrít. Pˇri zapnutém režimu s omezeným množstvím dílu˚ nám muže ˚ pomoci ujasnit si, jak rozsáhlý model mužeme ˚ postavit z dílu, ˚ která máme k dispozici. Po stisku tlaˇcítka v lištˇe nástroju˚ musí uživatel vybrat dva body trati, mezi kterými má být trat’ dopoˇcítána. S výbˇerem druhého bodu se spustí samotný algoritmus dopoˇcítání, který je implementován v metodˇe completeFragment(), jež je cˇ lenem tˇrídy WorkspaceWidget. V následujících podkapitolách jsou rozebrány možné pˇrístupy k dopoˇcítání trati. Ve zmínˇené metodˇe je použit druhý uvedený algoritmus.
8.7.1 Algoritmus cˇ . 1 Tento pˇrístup je založen na snaze snížit v každém kroku vzdálenost a rozdíl úhlu˚ mezi vybranými body za pomoci vložení jedné cˇ i dvou zatáˇcek, pˇrípadnˇe rovného dílu a zatáˇcky. Výhodou tohoto algoritmu je zpusob ˚ hledání nejlepších dílu, ˚ protože v každé iteraci je otestováno 8 kombinací dílu, ˚ což by mˇelo vést k nalezení dílu, ˚ pomocí kterých bude trat’ dostavˇena velmi dobrým zpusobem. ˚ Kritérium, které ovlivnuje ˇ výbˇer dílu, ˚ ale muže ˚ zpusobit ˚ problémy. V pˇrípadech, kdy uživatelem vybrané body smˇerˇ ují proti sobˇe, je snaha o postupné snižování vzdálenosti na místˇe, ale pokud body smˇerˇ ují od sebe a rozdíl mezi úhly v tˇechto bodech je blízký 180°, se muže ˚ snadno stát, že trat’ po dostavbˇe bude svým tvarem pˇripomínat kapku, ale v pˇrípadˇe autodráhy nepujde ˚ spojit (v pˇrípadˇe železnice by bylo tˇreba doplnit výhybku a rovnou cˇ ást trati). Vzdálenost i rozdíl úhlu˚ bude totiž v každé iteraci snížen, což bude vyhovovat danému kritériu, ale pˇresto trat’ nebude postavena akceptovatelným zpusobem. ˚ 34
8. M ANIPULACE S MODELEM Algoritmus 8.1 Automatické dopoˇcítání trati - verze cˇ . 1 P o i n t ptCurrent : = 1 . uživatelem vybraný bod P o i n t ptEnd : = 2 . uživatelem vybraný bod L i s t s t r L i s t //Seznam rovných d í l u˚ L i s t c r v L i s t //Seznam z a t á cˇ e k f o r e a c h ( d í l D z nabídky d í l u˚ ) do : ulož d í l D do p rˇ í s l u š n é h o seznamu while ( t r a t’ není d o s t a t e cˇ n eˇ kompletní ) do : d í l BestCurve : = c r v L i s t . head ( ) i n t CurveVersion : = 0 ; //0= L e f t , 1= Right , 2=LR , 3 = RL P o i n t B e s t P t : = koncový bod BestCurve / * n a j d i n e j l é p e v y h o v u j í c í zatá cˇ ku * / f o r e a c h ( d í l D z c r v L i s t ) do : P o i n t ptL : = nový koncový bod v z n i k l ý vložením l e v é verze d í l u D P o i n t ptR : = nový koncový bod v z n i k l ý vložením pravé verze d í l u D P o i n t ptLR : = nový koncový bod v z n i k l ý vložením sekvence : LD, RD P o i n t ptRL : = nový koncový bod v z n i k l ý vložením sekvence : RD, LD i f ( n eˇ k t e r ý z ptL , ptR , ptLR , ptRL s n í ž í v z d á l e n o s t ptCurrent a ptEnd && r o z d í l úhl u˚ mezi ptCurrent a ptEnd bude menší , nebo alespo nˇ s t e j n ý ) then : n a s t a v na p rˇ í s l u š n é hodnoty promeˇ nné B e s t P t a CurveVersion BestCurve : = D fi od d í l BestStraight := n i l / * o t e s t u j , zda v l o ž e n í rovného d í l u pˇr ed zatá cˇ ku/ s e k v e n c i z a t á cˇ e k v y l e p š í výsledek * / f o r e a c h ( d í l D z s t r L i s t ) do : i f ( koncový bod v z n i k l ý p rˇ idáním rovného d í l u pˇr ed d í l BestCurve s n í ž í v z d á l e n o s t mezi dráhami v bodech ptCurrent a ptEnd ) then : BestStraight := D fi od v lo ž do modelu nalezenou kombinaci d í l u˚ od
8.7.2 Algoritmus cˇ . 2 Dopoˇcítání tímto algoritmem je založeno na aproximaci chybˇející trati Bézierovou kubickou kˇrivkou. Ta je generována, pokud se naposledy vložený díl pˇríliš vychýlí od kˇrivky nebo pˇri každé páté iteraci. Zkoušel jsem generování kˇrivky v rozmezí každé 1. až 8. iterace a zvolení 5. iterace pˇrineslo nejlepší výsledky a nejpˇresnˇejší aproximaci trati. V algoritmu je použit limit 256 iterací, který zabrání pˇrípadnému zacyklení a zárovenˇ by mˇel pokrýt i stavbu rozsáhlých modelu. ˚ Pokud by ani toto množství dílu˚ nestaˇcilo na dostavbu trati, je možné opakovanˇe vybrat dva body a nechat tak trat’ dopoˇcítat ve více krocích. 35
8. M ANIPULACE S MODELEM Algoritmus 8.2 Automatické dopoˇcítání trati - verze cˇ . 2 Bod ptCurrent : = 1 . uživatelem vybraný bod Bod ptEnd : = 2 . uživatelem vybraný bod R e c t a n g l e r 1 : = R e c t a n g l e ( ptEnd . x−75,ptEnd . y −75 ,150 ,150) R e c t a n g l e r 2 : = R e c t a n g l e ( ptEnd . x−150,ptEnd . y −150 ,300 ,300) i n t i := 0 bool newBezier = t r u e //== t r u e vždy když j e t rˇ e b a znovu vygenerovat Bézierovu k rˇ ivku BezierCurve bC while ( p o s l e d n í vložený d í l ne uz a v rˇ e l t r a t’ && žádný z bodu˚ naposledy vloženého d í l u se nenachází v r 1 && ! ( n eˇ k t e r ý z bodu˚ naposledy vloženého d í l u se n a ch áz í v r 2 && v z d á l e n o s t mezi ptCurrent a ptEnd se z v eˇ t š i l a ) && i < 256 ) do : f l o a t i d e a l R a d i u s , idealAngle , i d e a l R a d i u s 2 , i d e a l A n g l e 2 //:= 0 i f ( newBezier ) then : / * k o n s t a n t a j e ur cˇ ena m eˇ rˇ ítkem , rozdílem úhl u˚ mezi ptCurrent a ptEnd a tím , zda se jedná o t r a t’ ž e l e z n i c e nebo autodráhy * / f l o a t p a r t O f D i s t : = d i s t a n c e ( ptCurrent , ptEnd ) / k o n s t a n t a P o i n t cp1 : = ptCurrent P o i n t cp2 : = ptCurrent + p a r t O f D i s t P o i n t cp3 : = ptEnd + p a r t O f D i s t P o i n t cp4 : = ptEnd t r a n s f o r m a c e cp2 , t a k aby m eˇ l s t e j n ý sm eˇ r j a k o ptCurrent t r a n s f o r m a c e cp3 , t a k aby m eˇ l s t e j n ý sm eˇ r j a k o ptEnd bC : = BezierCurve ( cp1 , cp2 , cp3 , cp4 ) / * j a k á hodnota j e do n á s l e d u j í c í c h prom eˇ nných uložena , j e v y s v eˇ t l e n o v t e x t u * / uprav hodnoty i d e a l R a d i u s , idealAngle , i d e a l R a d i u s 2 , i d e a l A n g l e 2 fi d í l BestMatch : = první d í l v nabídce d í l A l t e r n a t i v e M a t c h : = první d í l v nabídce i n t scoreBest := 0 i n t scoreAlternative := 0 f o r e a c h ( d í l D v nabídce ) do : scoreD : = na základ eˇ c h a r a k t e r i s t i k D odvod’ skóre ( d e t a i l y uvedeny v t e x t u ) i f ( scoreD > s c o r e B e s t ) then BestMatch : = D f i i f ( scoreD > s c o r e A l t e r n a t i v e ) then A l t e r n a t i v e M a t c h : = D f i od i f ( r o z d í l úhl u˚ mezi ptCurrent a ptEnd < 100 && v z d á l e n o s t t eˇ c h t o bodu˚ < 6 0 0 ) then : / * n a j d i n e j l e p š í možnou v a r i a n t u vložených d í l u˚ z možností : bL , bR , aLbL , aRbL , aLbR , aRbR , bLaL , bRaL , bLaR , bRaR , kde L z n a cˇ í levou v e r z i d í l u , R pravou v e r z i d í l u , b d í l BestMatch , a d í l A l t e r n a t i v e M a t c h * / vhodnou v e r z i d í l u , nebo vhodnou s e k v e n c i d í l u˚ vlož do modelu else : rozhodni , zda se k rˇ i v c e l é p e p rˇ i b l í ž í v l o ž e n í l e v é nebo pravé verze d í l u vhodnou v e r z i d í l u v lož do modelu fi ptCurrent : = koncový bod vloženého d í l u , k t e r ý j e n e j b l í ž e k rˇ i v c e i ++ od
Obrázek 8.1: Proložení trati Bézierovou kˇrivkou 36
8. M ANIPULACE S MODELEM V cˇ ásti algoritmu, která zjišt’uje parametry ideálních dílu, ˚ se z bodu˚ na kˇrivce vytvoˇrí dva trojúhelníky a z kružnic jim opsaných se urˇcí polomˇer a úhel dvou ideálních dílu, ˚ které jsou kˇrivkou aproximovány nejlépe. První trojúhelník je charakterizován body c(0), c(1/6), c(1/3). Druhý je dán body c(0), c(1/4), c(1/2), kde c(t) je funkce implementující algoritmus de Casteljau, která vrátí bod na kˇrivce, t je z intervalu [0,1], pro t=0 je vrácen první kontrolní bod, pro t=1 je to cˇ tvrtý kontrolní bod. Pˇri hledání vhodného dílu ke vložení se používá skóre, které je pro ˇ každý díl inicializováno na nulu. Cím menší je rozdíl ideálního polomˇeru ˇ a polomˇeru konkrétního dílu, tím více se skóre zvˇetší. Cím menší je zbytek po dˇelení ideálního úhlu a úhlu daného dílu, tím více se skóre zvˇetší. Pokud je rozdíl polomˇeru˚ pro daný díl lepší, než mˇel momentálnˇe nejlepší díl, skóre je dále zvýšeno. Skóre je sníženo pro díly výhybek, pro autodráhové díly se zúžením trati je nastaveno tak, aby nebyly použity. Pˇri testování ruzných ˚ kombinací vložení nejlepšího a druhého nejlepšího dílu dostane pˇrednost varianta, po jejímž použití se dráhy nasmˇerují pˇresnˇeji proti sobˇe a zárovenˇ se rozdíl úhlu˚ nezhorší. Tato optimalizace vedla ke zlepšení výsledku. ˚ Tento algoritmus je lepší než první uvedený v tom ohledu, že je chybˇející trat’ nahrazena Bézierovou kˇrivkou. Tím je vyˇrešen problém bodu˚ smˇerˇ ujících od sebe, protože díly jsou vybírány tak, aby co možná nejlépe kopírovaly tvar vygenerované kˇrivky. Pokud si uživatel postaví cˇ ást rovné trati a poté by spustil na protˇejších koncových bodech dopoˇcítání trati, došlo by k zacyklení, protože kˇrivka bude vždy odpovídat pˇrímce a té bude nejlépe vyhovovat rovný díl. V tomto pˇrípadˇe je tedy druhý a tˇretí kontrolní bod kˇrivky otoˇcen o 3 stupnˇe, což zpusobí ˚ výbˇer zatáˇcky a zabrání tak zacyklení, resp. vložení 256 rovných dílu. ˚ Slabinou tohoto algoritmu je výbˇer dílu˚ v pˇrípadech, kdy je vzdálenost mezi dvˇema body malá. Muže ˚ se stát, že jsou v nabídce díly, které by vyhovovaly lépe, ale nejsou použity z duvodu ˚ jejich nižšího skóre. Pokoušel jsem se tento problém odstranit tak, že je skóre dílu sníženo, pokud jeho délka pˇresahuje vzdálenost mezi dvˇema koncovými body a dosáhl jsem snížení poˇctu výskytu˚ této situace, ale úplného odstranˇení se mi nepodaˇrilo docílit. Duvodem ˚ je to, že v urˇcitých situacích muže ˚ kˇrivka tvarem pˇripomínat písmeno S, ale vzdálenost mezi body je malá. Tím se dostáváme do situace, kdy má ideální díl velmi malý polomˇer, který muže ˚ být i nˇekolikanásobnˇe menší než nejmenší polomˇer dílu˚ v nabídce. Potom už není možné se vkládáním dalších dílu˚ lépe pˇriblížit požadovanému bodu a trat’ uzavˇrít. Na obrázku 8.2 je vlevo výsledek, kterého by dosáhl první algoritmus, vpravo je výsledek po spuštˇení druhého algoritmu. 37
8. M ANIPULACE S MODELEM
Obrázek 8.2: Srovnání výsledku˚ dopoˇcítání trati
38
9 Model jako sada pˇríkazu˚ Tˇrída WorkspaceWidget poskytuje mechanismus pro funkce Zpˇet a Znovu, Kopírovat, Vložit a Vyjmout a pro uložení a otevˇrení souboru. Každá akce, kterou má uživatel k dispozici, muže ˚ být reprezentována jako rˇ etˇezec ve specifickém tvaru. S výjimkou otáˇcení, posunu a manipulace s výškovým profilem trati jsou pak všechny akce zaznamenávány v metodách této tˇrídy, zmínˇené tˇri funkce se zaznamenávají z metod tˇrídy ModelItem, nebo ModelFragment. Možnost reprezentace modelu formou pˇríkazu˚ pˇrináší výhodu zejména v pˇrípadˇe funkcí Zpˇet a Znovu, kdy se informace o stavu celé pracovní plochy nahradí jedním rˇ etˇezcem vracejícím se o krok zpˇet resp. vpˇred, a pˇri naˇcítání souboru, kdy se díl po dílu vybuduje vše na pracovní ploše. Následuje výˇcet všech pˇríkazu, ˚ které mohou být programem zpracovány: •
null neighbour alpha x y – do aktivního úseku trati vloží koncový bod (x,y) s úhlem alpha,
•
null neighbour2 alpha x y – viz pˇredchozí, ale poslední vložený díl je nastaven jako díl v tomto bodˇe; oba pˇríkazy jsou používány v situacích, kdy nelze díl vložit tak, aby byl pˇripojen svým prvním bodem. Takové situace mohou vzniknout smazáním jiných dílu. ˚
•
make point x y – hodnota aktivního bodu je zmˇenˇena na bod (x, y), aktivní úsek trati se nastaví na nulový ukazatel (následné vložení dílu tedy vytvoˇrí nový úsek),
•
make item partNo prodLineName L x y – do aktivního úseku trati vloží do bodu (x,y) levý (parametr L) nebo pravý (R namísto L) díl partNo, náležící do nabídky dílu˚ s názvem prodLineName,
•
make border partNo prodLineName x y – k vybranému dílu se do bodu (x,y) vloží díl krajnice partNo, náležící do nabídky dílu˚ s názvem prodLineName,
•
make vegetation partNo prodLineName x y – do bodu (x, y) vloží model vegetace,
•
select point x y - hodnota aktivního bodu je zmˇenˇena na bod (x,y), aktivní úsek trati je nastaven na úsek s koncovým bodem (x,y), 39
ˇ ˚ 9. M ODEL JAKO SADA P RÍKAZ U
•
select item sX sY – vybere trat’ový díl, jehož vektorový model má pozici ve scénˇe (sX,sY),
•
select vegetation sX sY – vybere model vegetace s pozicí ve scénˇe (sX,sY),
•
select fragment ID – najde úsek trati s daným ID a nastaví ho jako aktivní,
•
move fragment ID dX dY – posune úsek s daným ID o vzdálenost (dX,dY) ve smˇeru os (x,y),
•
move vegetation sX sY dX dY – posune model vegetace s pozicí ve scénˇe (sX,sY) o vzdálenost dX ve smˇeru osy x a dY ve smˇeru osy y,
•
rotate fragment ID cX cY alpha – otoˇcí úsek trati s daným ID o úhel alpha kolem bodu (cX,cY),
•
rotate item sX sY cX cY alpha – otoˇcí trat’ový díl na pozici (sX,sY) kolem bodu (cX,cY) o úhel alpha. Pˇríkaz je používán pouze pˇri ohybu trati,
•
rotate vegetation sX sY cX cY alpha – otoˇcí model vegetace na pozici (sX,sY) kolem bodu (cX,cY) o úhel alpha,
•
height point dZ x y sX sY – upraví výšku dílu na pozici (sX, sY). Výška v bodˇe (x,y) se upraví o hodnotu dZ,
•
delete fragment ID – odstraní celý trat’ový úsek s uvedeným ID,
•
delete item ID sX sY – odstraní trat’ový díl na pozici (sX,sY), který náleží do úseku trati s uvedeným ID,
•
delete vegetation sX sY – odstraní model vegetace na pozici (sX,sY),
•
delete border ID sX sY - odstraní díl krajnice na pozici (sX, sY), který je pˇripojen k trati z úseku s uvedeným ID,
•
connect xA yA xB yB IDA IDB – spojí úseky trati s IDA a IDB. Ke spojení jsou použity body (xA,yA) a (xB,yB),
•
disconnect IDC x y IDA IDB – vytvoˇrí dva úseky trati z jednoho. Trat’ se rozdˇelí v bodˇe (x,y) a novým úsekum ˚ jsou pˇriˇrazeny uvedené ID, 40
ˇ ˚ 9. M ODEL JAKO SADA P RÍKAZ U
•
bend close ID pt1X pt1Y pt2X pt2Y – ohybem uzavˇre úsek trati s daným ID. Ke spojení jsou použity body (pt1X,pt1Y) a (pt2X, pt2Y),
•
bend open ID pt1X pt1Y pt2X pt2Y – úsek trati s ID doplní o body (pt1X,pt1Y) a (pt2X,pt2Y). Ohyb nelze tímto pˇríkazem vrátit zpˇet, tato možnost je zajištˇena pˇríkazem rotate item,
•
bend2 close IDa IDb pt1X pt1Y pt2X pt2Y a bend2 open IDa IDb pt1X pt1Y pt2X pt2Y – používané pro ohyb dvou samostatných úseku˚ trati.
Interpretaci pˇríkazu˚ zajišt’uje metoda commandExecution() tˇrídy WorkspaceWidget. V této metodˇe se ovˇerˇ í, zda mají pˇríkazy správné argumenty a pokusí se najít napˇr. díly na uvedené pozici nebo úsek trati se zadaným ID. Pokud tento proces probˇehne úspˇešnˇe, zavolá se pˇríslušná metoda s potˇrebnými parametry, což zpusobí ˚ provedení pˇríkazu.
9.1
Funkce Zpˇet a Znovu
Mezi atributy tˇrídy WorkspaceWidget patˇrí mimo jiné dva seznamy pˇríkazu, ˚ s jejichž pomocí lze zajistit funkce, kterými lze vracet nebo znovu provádˇet zmˇeny v modelu. Každá akce, která nˇejakým zpusobem ˚ mˇení model, má svuj ˚ protˇejšek, jehož provedením se model vrátí do puvodního ˚ stavu. V jednom ze seznamu˚ je tedy uložena posloupnost akcí, které uživatel vykonal od vytvoˇrení nového projektu až dosud. Druhý seznam obsahuje akce, jejichž vykonáním (poˇcínaje od naposledy vložené akce) se po jednotlivých krocích dostaneme až k prázdné pracovní ploše. Pˇríkazy v seznamech se neukládají do souboru. Po naˇctení modelu ze souboru tedy nelze použít funkci Zpˇet. K uvedeným dvˇema seznamum ˚ ještˇe patˇrí pomocná promˇenná. V ní je uložena pozice v seznamech, na které se bude pokraˇcovat provádˇením pˇríkazu. ˚ Funkce Zpˇet nejprve provede pˇríkaz a poté sníží pozici, funkce Znovu nejprve zvýší pozici a poté provede pˇríkaz. Pˇri pohybu nebo otáˇcení modelu se do seznamu˚ vkládají pˇríkazy velmi cˇ asto (s každým vyvoláním události pohybu myši). Uživatel by tak byl nucen odvolávat pohyb po malých zmˇenách (záleží na rychlosti provedení pohybu, zpravidla velikost zmˇeny nepˇrekraˇcuje 5 bodu˚ nebo stupnˇ u), ˚ proto tyto dvˇe funkce „sdružují“ provádˇení nˇekterých pˇríkazu. ˚ 41
ˇ ˚ 9. M ODEL JAKO SADA P RÍKAZ U
9.2
Funkce spojené s kopírováním dílu˚
Trat’ový editor by mˇel podporovat funkce umožnující ˇ uživatelem vybrané díly vyjmout, kopírovat a vložit. Všechny tˇri funkce jsou k dispozici i v mojí aplikaci a jejich fungování je založeno, stejnˇe jako u funkcí Zpˇet a Znovu, na textových pˇríkazech. Do tˇrídy WorkspaceWidget patˇrí seznam zkopírovaných dílu, ˚ do nˇehož jsou po stisknutí klasické kombinace kláves Ctrl+C nebo Ctrl+X zapsány pˇríkazy pro vytvoˇrení dílu. ˚ V pˇrípadˇe použití funkce Vyjmout jsou následnˇe puvodní ˚ díly smazány. Po stisku klávesové kombinace Ctrl+V je obsah schránky vložen do aktuálnˇe vybraného bodu na pracovní ploše. Díly nejsou vloženy tak, aby pˇresnˇe kopírovaly svou puvodní ˚ prostorovou orientaci, což je výhodou zejména pˇri kopírování dílu˚ z ruzných ˚ koncu˚ rozsáhlé trati. Vložení dílu˚ probˇehne pˇresnˇe v tom poˇradí, v jakém byly oznaˇcovány pˇred zkopírováním. Díly se vloží tak, aby z nich vznikla souvislá cˇ ást trati, takže jimi mužeme ˚ snadno rozšiˇrovat už existující trat’ové úseky.
9.3
Funkce Nový, Otevˇrít, Uložit
Je nezbytné, aby si uživatel mohl uložit rozpracovaný projekt, pozdˇeji v nˇem pokraˇcovat, nebo vytvoˇrit nový projekt bez nutnosti opˇetovného spuštˇení aplikace. Tyto tˇri funkce jsou poskytovány funkcionalitou tˇríd Application, WorkspaceWidget a SideBarWidget. Pˇri vytvoˇrení nového projektu je uživatel nejprve dotázán, zda mají být dosud neuložené zmˇeny zapsány do souboru. Poté je vyzván k zadání velikosti pracovní plochy. Implicitní hodnota je 4000x3000 mm a je použita i pˇri spuštˇení aplikace, kdy není uživateli nabídnuta zmˇena velikosti plochy. Po potvrzení zadaných údaju˚ se vyprázdní boˇcní panel, vyˇcistí se grafická scéna pracovní plochy a odstraní se všechny modely. Tím je program pˇripraven k další práci s novým – prázdným projektem. Projekt si uživatel muže ˚ uložit do textového souboru. V nˇem jsou uvedeny názvy všech výrobcu, ˚ jejichž díly mají být k dispozici v boˇcním panelu a výrobce, který bude zobrazen. Následují data pro nastavení pracovní plochy – velikost plochy, mˇerˇ ítko zobrazení a bod, v nˇemž se bude nacházet stˇred zobrazení. Ukládání posledních dvou údaju˚ lze vypnout v nastavení, což muže ˚ být výhodné v pˇrípadech, kdy je soubor s modelem verzován. Po každém uložení by tak verzovací systém evidoval zmˇeny v podobˇe nového mˇerˇ ítka zobrazení a bodu stˇredu zobrazení. V souboru jsou dále zapsány pˇríkazy, pomocí kterých je pˇri naˇctení vystavˇen model. Jsou to stejné pˇríkazy, které se používají i ve funkcích Zpˇet a Znovu. Po pˇríkazech pro stavbu 42
ˇ ˚ 9. M ODEL JAKO SADA P RÍKAZ U
PROJECT DATA jméno p r o j e k t u Loaded manufacturers : v ý cˇ e t výrobc u˚ , k t e rˇ í budou v nabídce bo cˇ ního panelu A c t i v e manufacturer : j e d e n výrobce z nabídky , j e h o ž d í l y se z o b r a z í v boˇc ním panelu WORKSPACE DATA s t rˇ e d z o b r a z e n í rozm eˇ ry pracovní plochy m eˇ rˇ ítko z o b r a z e n í p rˇ í ka z y pro výstavbu t r a t i p rˇ í k az y pro n a s t a v e n í výšky t r a t i INVENTORY obsah i n v e n t á rˇ e
Tabulka 9.1: Kostra uloženého souboru modelu následují úpravy výškového profilu. Tyto pˇríkazy musí být provedeny až po dokonˇcení stavby celé trati. Díky zpusobu ˚ práce s výškou trati pˇri vkládání dílu˚ (vysvˇetleno v kapitole Vložení nového dílu) by trat’ smˇerem od poˇcáteˇcního dílu trat’ového úseku nemohla klesat. Na konci souboru je vypsán stav inventáˇre, který byl platný v okamžiku uložení souboru. Pˇri otevˇrení souboru je uživatel vyzván k pˇrípadnému uložení zmˇen, provede se „vyˇcištˇení“ pracovní plochy a boˇcního panelu, stejnˇe jako pˇri vytvoˇrení nového souboru, boˇcní panel se naplní pˇreˇctenými daty a poté se zavolá metoda tˇrídy WorkspaceWidget, která zajistí provedení všech pˇríkazu˚ týkajících se modelu. Nakonec je nastaven obsah inventáˇre pomocí metody tˇrídy SideBarWidget. Pokud je v souboru použit nˇejaký díl, který není dostupný, nebo se nezdaˇrí provedení nˇekterého z pˇríkazu, ˚ naˇcítání souboru je zrušeno. Uložení souboru probíhá analogicky, jen se neprovádí vyprázdnˇení pracovní plochy a boˇcního panelu. Program pochopitelnˇe nabízí i funkci Uložit jako a také eviduje pˇet naposledy otevˇrených souboru. ˚ Kromˇe uložení do textového souboru je možné exportovat obsah grafické scény do obrázku ve formátu PNG. Tato funkce je dostupná v menu „Soubor.“ Poslední možností, jak exportovat data z programu Rail & Slot Editor, je uložení informací o modelu do HTML souboru. Tato funkce se nachází v menu „Model” a v HTML souboru vytvoˇrí pˇrehlednou tabulku obsahující všechny trat’ové úseky, díly kterými jsou tvoˇreny a k jednotlivým dílum ˚ doplní i jejich popis.
43
10 Práce s inventáˇrem Program umožnuje ˇ práci v režimu s omezeným množstvím dílu, ˚ k cˇ emuž potˇrebuje znát dostupné množství každého dílu v nabídce. Pˇri spuštˇení programu nebo pˇri vytvoˇrení nového projektu se naˇcte obsah inventáˇre – textového souboru Inventory.rsi. Pokud soubor nelze otevˇrít, nebo pokud neexistuje, použije se jako implicitní hodnota 10 kusu. ˚ Uživatel si dostupné množství daného dílu nastaví tak, že v boˇcním panelu klikne pravým tlaˇcítkem myši na požadovaný díl a v kontextovém menu zvolí položku „Zmˇenit dostupné množství dílu“. Zobrazí se jednoduché dialogové okno, v nˇemž se zvolí množství, které je k dispozici. Zadané cˇ íslo musí být nezáporné a muže ˚ být nejvýše 999. Potom, co uživatel dokonˇcí editaci inventáˇre, muže ˚ v menu „Soubor“ vybrat volbu „Uložit stav inventáˇre“, která zpusobí ˚ pˇrepsání celého souboru inventáˇre. Jsou do nˇej zapsány všechny díly všech výrobcu, ˚ kteˇrí jsou dostupní v knihovnˇe dílu, ˚ tedy nikoliv jen ti, kteˇrí jsou aktuálnˇe nabízeni v boˇcním panelu. Jak už bylo zmínˇeno v pˇredchozí kapitole, stav inventáˇre se ukládá i do každého souboru s modelem. Duvodem ˚ je zvýšení komfortu uživatele, protože pokud uživatel má urˇcitou sadu dílu, ˚ z nichž by chtˇel postavit nˇejakou trat’, nastaví si stav inventáˇre podle skuteˇcnosti a než se pustí do stavby skuteˇcného modelu, bude si zˇrejmˇe chtít vyzkoušet podobu ruzných ˚ tratí. Pokud by se inventáˇr ukládal pouze do souboru Inventory.rsi, byl by jeho stav ovlivnˇen stavbou ruzných ˚ modelu, ˚ což odporuje popsanému zámˇeru uživatele. Pokud by byl stav inventáˇre uložen pouze v souborech s modely, byl by uživatel nucen zadávat stavy dílu˚ pˇred zapoˇcetím stavby každého modelu, což by mohlo vést k nespokojenosti uživatele. Proto je vždy pˇri vytvoˇrení nového souboru použit globální stav inventáˇre a pˇri nacˇ tení souboru je pˇrepsán daty ze souboru, která odpovídají poˇcetním stavum ˚ dílu˚ po stavbˇe daného okruhu.
44
11 Použití programu v praxi Na testování aplikace Rail & Slot Editor se podílel vedoucí kroužku železniˇcního modeláˇrství a nˇekteˇrí z jeho žáku. ˚ Vedoucí byl s programem velmi spokojený a vyzdvihl zejména snadné ovládání programu. Mˇel drobné pˇripomínky k výbˇeru dílu˚ pro automatické dopoˇcítání trati, proto byla tato cˇ ást programu optimalizována. Program bude v kroužku využíván ke dvˇema druhum ˚ cˇ inností. Primární využití bude mít mezi žáky, kteˇrí v nˇem budou navrhovat trat’, jež budou stavˇet. Jeden ze starších žáku˚ bude povˇerˇ en vybudováním železniˇcního koridoru Znojmo-Jemnice, jehož stavba v podobˇe modelu se poté stane dlouhodobˇejší cˇ inností všech žáku. ˚ Druhý zpusob ˚ využití spoˇcívá v poskytnutí srozumitelných podkladu˚ pro sestavení rozpoˇctu potˇrebného pro nákup dalších dílu. ˚ Vedoucí i žáci se shodli na tom, že výhledovˇe by uvítali rozšíˇrení programu o 3D náhled postaveného modelu a možnost vložení obrázku na pozadí pracovní plochy. Druhá jmenovaná funkce by výraznˇe ulehˇcila budování modelu skuteˇcné trati, napˇr. podle satelitních snímku˚ jejího okolí.
45
12 Závˇer Cílem práce byla analýza existujících nástroju˚ a následné vytvoˇrení grafického editoru pro Linux/X11 dle požadovaných kritérií. Analýza existujících programu˚ ukázala, že rozšiˇritelná knihovna cˇ i databáze dílu˚ je spíše výjimkou a schopnost zohlednit výškovou strukturu terénu je doménou programu˚ zamˇerˇ ených na stavbu modelové železnice. S funkcí automatického dopoˇcítání trati jsem se nesetkal u žádného programu, zatímco možnost uzavˇrít trat’ za pomoci ohnutí dráhy nˇekteré programy zvládají. Díky použití toolkitu Qt lze program Rail & Slot Editor spustit nejen na Linuxu, jak bylo požadováno, ale i na jiných operaˇcních systémech, což dává pˇríležitost k získání širší uživatelské základny. Program je dodáván s pˇredpˇripravenou knihovnou dílu, ˚ kterou lze snadno rozšíˇrit, cˇ ímž se uživatelum ˚ otevírá možnost editovat trat’ postavenou z ruznorodých ˚ dílu. ˚ Podporované druhy dílu˚ byly zvoleny tak, aby mˇel uživatel k dispozici spíše univerzální paletu dílu, ˚ ale aby zárovenˇ bylo možné specifické díly postavit za pomoci kombinace „základních“ dílu. ˚ Program je vytvoˇren pod licencí GNU GPL a kód programu je dostupný na internetovém úložišti programu˚ [15], což dává prostor k dalšímu rozšírˇ ení funkcionality i jiným vývojáˇrum. ˚ Program by mohl být rozšíˇren o 3D náhled modelu nebo o implementaci jiného algoritmu pro zohlednˇení pružnosti trat’ových dílu. ˚ Specifikace pružnosti by pak mohla být obsažena v knihovnˇe dílu. ˚ Byla by uvedena u každého dílu, cˇ ímž by se docílilo vˇetší realistiˇcnosti stavby modelu v mém programu.
46
Literatura [1] DRail Modelspoor Software. AnyRail [online]. Ver. 5.10, rˇ íjen 2013 [cit. 1. 3. 2014]. Huissen [Nizozemsko]. Dostupné z
. Vyžaduje Windows XP Service Pack 3 nebo novˇejší. [2] FISCHER, Martin. XtrkCAD [online]. Ver. 4.0.3, 2010 [cit. 1. 3. 2014]. Dostupné z . [3] GUILLARD-PREVERT, Pierrick. Ultimate Racer 3.0 [online]. Ver. 3.0, 2013 [cit. 1. 3. 2014]. Dostupné z . [4] Digia, Nokia. Qt Project [online]. Ver. 5.1.1, 2013 [cit. 1. 3. 2014]. Helsinki. Dostupné pro ruzné ˚ platformy z . [5] A-Lab Software Limited. Scalextric Track Designer [online]. Ver. 1.1.2, 2009 [cit. 1. 3. 2014]. Westwood, Margate. Dostupné z . [6] PEEV, Milen. SCARM [online]. Ver. 0.9.2 Beta [cit. 1. 3. 2014]. Sofia. Dostupné z . [7] VERSLUIS, Rob. Rocrail [online]. Revize 7224 [cit. 26. 4. 2014]. Dudenhofen. Dostupné z . [8] Deepwoods Software. Model Railroad System [online]. Ver. 2.1.33 [cit. 26. 4. 2014]. Wendell. Dostupné z . [9] X.Org Foundation. Xlib [online]. Ver. 11, vydání 7.7 [cit. 26. 4. 2014]. Dostupné z . [10] GNOME Foundation, CHAPLIN Damon. Glade [online]. Ver. 3.16 [cit. 26. 4. 2014]. Dostupné z . 47
[11] BLANCHETTE, Jasmin Blanchette. C++ GUI programming with Qt 4. SUMMERFIELD, Mark. 2nd edition. Upper Saddle River, N.J. : Prentice Hall, c2008. ISBN 9780132354165. ˚ [12] TUMA, Ondˇrej. Benchmark práce s objekty v jazycích C++, Vala a Python [online]. 20. 9. 2011 [cit. 26. 4. 2014]. Dostupné z . [13] ZAHARIEV, Ivan. C++ vs. Python vs. Perl vs. PHP performance benchmark [online]. 1. 7. 2010 [cit. 26. 4. 2014]. Dostupné z . [14] FULGHAM, Brent. Computer Language Benchmarks Game [online]. GOUY, Isaac. 2004-2014 [citováno 26. 4. 2014]. Dostupné z . [15] SKIPALA, Milan. Rail & Slot Editor [online]. 2013-2014 [citováno kvˇeten 2014]. Dostupné z .
48
Seznam obrázku˚ 7.1
Ukázka specifikace tˇrí druhu˚ dílu˚ . . . . . . . . . . . . . . . .
26
8.1 8.2
Proložení trati Bézierovou kˇrivkou . . . . . . . . . . . . . . . Srovnání výsledku˚ dopoˇcítání trati . . . . . . . . . . . . . . .
36 38
49
Seznam tabulek 7.1
Kostra databázového souboru . . . . . . . . . . . . . . . . . .
25
9.1
Kostra uloženého souboru . . . . . . . . . . . . . . . . . . . .
43
50
Seznam algoritmu˚ 8.1 8.2
Automatické dopoˇcítání trati - verze cˇ . 1 . . . . . . . . . . . . Automatické dopoˇcítání trati - verze cˇ . 2 . . . . . . . . . . . .
35 36
51
A Prototypy uživatelského rozhraní Skica uživatelského rozhraní s možností výbˇeru výrobcu˚
52
A. P ROTOTYPY UŽIVATELSKÉHO ROZHRANÍ
Skica uživatelského rozhraní se stálou nabídkou všech výrobcu. ˚
53
B Obsah CD •
text bakaláˇrské práce ve formátu PDF
•
ZIP archiv se zdrojovými soubory programu Rail & Slot Editor
•
ZIP archiv se zkompilovaným programem a knihovnami potˇrebnými pro bˇeh na systému Windows 7
•
ZIP archiv se zkompilovaným programem a knihovnami potˇrebnými pro bˇeh na systémech typu UNIX
•
ZIP archiv se soubory potˇrebnými ke spuštˇení na libovolné platformˇe (databáze dílu, ˚ ikony, soubor s implicitním uživatelským nastavením a soubor s inventáˇrem, archiv neobsahuje spustitelný soubor)
54