Uživatelský interface pro GIS a CAD z hlediska programátora
Dr. Ing. Alexandr Štefek
Katedra technické kybernetiky a vojenské robotiky
Vojenská akademie Brno
PS 13, 612 00 Brno
E-mail: alex@mrkev.vabo.cz
Abstrakt
Jeden z aktuálních směrů rozvoje aplikací kategorie GIS a CAD je vytváření komponent, které reprezentují jádro budoucího programu. Některé tyto komponenty neposkytují potenciálnímu uživateli nástroje pro manipulaci s geometrickými či geografickými prvky. Tento příspěvek se prezentuje zkušenosti z vytváření uživatelského interface pro CAD a GIS. Tyto zkušenosti jsou využitelné pro vytváření aplikací založených na komerčních komponentách (např. MapObjects), ale i při vytváření vlastních komponent (např. pro programovací jazyky Delphi, Builder).
Úvod
Prvky, ze kterých se skládá systém (protože dále uvedené poznatky jsou aplikovatelné jak v oblasti GIS, tak v oblasti CAD, budu používat k pojmenování libovolného z těchto systémů pojem systém), lze rozdělit do dvou skupin. První skupinu tvoří prvky (dále objekty), které nesou (geo)grafickou informaci, druhou skupinu tvoří prvky, které umožňují interakci uživatele s objekty. Do druhé skupiny patří především okna operačního systému (pohledy), která zobrazují objekty, a nástroje pro manipulaci s objekty. (obecně nástroje mohou manipulovat i s pohledy)
Z hlediska komunikace uživatelem s nástrojem existují dva typy systémů. Prvním typem je systém, který neumožňuje uživateli během jediné akce s nástrojem přecházet mezi různými pohledy. Druhým typem je systém, který naopak toto umožňuje. Lze tedy například zadávat vrcholy lomené čáry v různých pohledech. (např. CAD Microstation). Z hlediska obecnosti se budu v dalším implicitně předpokládat, že uživatel požaduje druhý typ systému. Schéma takového systému je uvedeno na obrázku 1.
Obrázek 1 “Interakce uživatele se systémem”
Uživatel pomocí vstupních zařízení (obvykle myš) v jednotlivých pohledech zadává body. Tyto body potom systém zpracovává podle aktuálně zvoleného nástroje a reaguje tak na pokyny uživatele.
Zprávy
V souladu s filozofií současných operačních systémů lze na základě vstupu od uživatele generovat vnitřní zprávy systému. Vzhledem ke skutečnosti, že uživatel zadává povely přes pohledy, jsou obvykle pohledy zdrojem těchto zpráv. Při interakci uživatele prostřednictví myši vytváří operační systém zprávy MOUSEMOVE, MOUSEDOWN, MOUSEUP. Na základě těchto zpráv jsou dále detekována kliknutí a dvojkliknutí tedy CLICK, DBLICK. Těchto pět zpráv je adresováno pohledům, ve kterých vznikly a je tedy nutné, aby právě pohledy tyto zprávy zpracovaly. Prvním krokem při zpracování je identifikace bodu, kde byla událost vyvolána.
Každý pohled zobrazuje určitou (geo)grafickou oblast. Lze tedy odvodit jednoznačné matematické vztahy pro transformaci souřadného systému okna do souřadného systému CAD/GIS. Na základě zpráv lze potom vytvářet zprávy pro jádro systému, ovšem již s informací o (geo)grafické poloze, kde tato událost vznikla. Jádro systému zpracovává zprávy bez ohledu na původ. Tato skutečnost se uživateli projeví jako možnost neomezovat se při práci s nástrojem na jediný pohled (např. lze kreslit lomenou čáru přes více pohledů).
Systém přijímá zprávy MOUSEMOVE, MOUSEDOWN, MOUSEUP, CLICK, DBLICK a podle aktivního nástroje tyto zprávy zpracovává. Pro tento způsob zpracování je vhodné zavést “ActiveTool”, který zpracovává přicházející zprávy. Využijeme-li programovacích jazyků pro objektově orientované programování (OOP) a jestliže dodržíme pravidla pro dědičnost a metody pro zpracování uvedených zpráv budou virtuální, potom jednoduchým zděděním třídy, která implementuje metody pro zpracování zpráv, a přepsáním odpovídajících virtuálních metod můžeme vytvořit sadu nástrojů.
Schéma systému pracujícího s “ActiveTool” je uvedeno na obrázku 2.
Obrázek 2 “ActiveTool v systému”
“ActiveTool” převezme zprávu spolu s upravenými souřadnicemi, zpracuje ji. Jestliže do parametrů vložíme také zdroj události (pohled), můžeme pohled zvětšovat, zmenšovat atd.
Implementace pomocí OOP
Implementace, založená na OOP, předpokládá existenci tří základních tříd:
1. Pohled
implementované vlastnosti
Vlastnik: JadroSystemu
implementované metody
MouseMove(x,y: celecislo)
MouseDown(x,y: celecislo)
MouseUp(x,y: celecislo)
Click(x,y: celecislo)
DblClick(x,y: celecislo)
Všechny implementované metody nejdříve přepočítají souřadnice v rámci pohledu (x,y) na (geo)grafické souřadnice a následně volají odpovídající metody u Vlastnik.ActiveTool.
2. JadroSystemu
implementované vlastnosti
ActiveTool: Nastroj
3. Nastroj
implementované metody
MouseMove(x,y: desetinnecislo)
MouseDown(x,y: desetinnecislo)
MouseUp(x,y: desetinnecislo)
Click(x,y: desetinnecislo)
DblClick(x,y: desetinnecislo)
V případě, že mezi nástroje zařadíme i nástroje pro práci s pohledy, je nutné definovat metody s následujícími parametry:
MouseMove(x,y: desetinnecislo, zdroj: pohled)
.
.
DblClick(x,y: desetinnecislo, zdroj: pohled)
Tyto vyjmenované metody musí být virtuální tak, aby je mohl potomek přepsat. Potom lze definovat nové třídy, vždy pro každý nástroj novou třídu. Instanci nově definované třídy lze přiřadit vlastnosti ActiveTool (to se děje při změně nástroje uživatelem). Tak, zcela nezávisle na ostatních částech systému, lze vytvářet nové nástroje pro práci s objekty v rámci systému. Změnu aktivního nástroje provedeme pouhým přiřazením instance třídy jiného nástroje do vlastnosti ActiveTool.
Závěr
Implementace uživatelského rozhraní výše uvedeným způsobem poskytuje dvě základní výhody pro vývojový tým:
Základní principy, které zde byly uvedeny, lze aplikovat na systém, který je zcela vyvíjen ve vlastní režii, stejně tak na systém, jehož základem je komerčně dostupná komponenta, či celý systém. Tyto principy byly prakticky ověřeny při vývoji systému.