PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITY PALACKÉHO KATEDRA INFORMATIKY
BAKALÁŘSKÁ PRÁCE
Nástroj pro rýsování
2012
David Jarůšek
Anotace Program Geometrie umožňuje rýsování výkresů na počítači. Simuluje rýsování jak jej známe ze základní školy. Při vytváření výkresu se používá pravítko, kružítko, úhloměr, tužka, guma a textové pole. Výsledný výkres je možné ukládat a načítat v XML formátu. Dále program umožňuje exportovat výkres do SVG nebo PDF. Celý program je vytvořen v jazyce C# pro .NET Framework 4.
Děkuji vedoucímu práce Mgr. Janu Outratovi, Ph.D. za cenné rady a připomínky při psaní bakalářské práce. Manželce a synovi děkuji za trpělivost.
Obsah 1. Úvod
5
2. Programátorská dokumentace 2.1. Použité technologie a nástroje . . . . 2.2. Provázání částí programu . . . . . . 2.3. Zpracování událostí v kreslícím okně 2.3.1. Třídy zpracovávající události 2.3.2. Hierarchie akcí . . . . . . . . 2.4. Výkres a grafické objekty . . . . . . . 2.5. Rýsovací pomůcky . . . . . . . . . . 2.6. Vykreslování objektů do okna . . . . 2.7. Uložení a export výkresu . . . . . . . 2.8. Načtení výkresu . . . . . . . . . . . . 3. Uživatelská příručka 3.1. Požadavky na systém . . . 3.2. Instalace . . . . . . . . . . 3.3. Hlavní okno . . . . . . . . 3.4. Rýsovací pomůcky . . . . 3.5. Nastavení, uložení, načtení
. . . . a
. . . . . . . . . . . . . . . . export
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . výkresu
. . . . . . . . . .
. . . . .
. . . . . . . . . .
. . . . .
. . . . . . . . . .
. . . . .
. . . . . . . . . .
. . . . .
. . . . . . . . . .
. . . . .
. . . . . . . . . .
. . . . .
. . . . . . . . . .
. . . . .
. . . . . . . . . .
. . . . .
. . . . . . . . . .
. . . . .
. . . . . . . . . .
. . . . .
. . . . . . . . . .
. . . . .
. . . . . . . . . .
6 6 7 8 9 9 13 16 17 17 18
. . . . .
19 19 19 19 23 27
Závěr
29
A. Validační schema
30
B. Obsah přiloženého CD
33
Seznam obrázků 1. 2. 3. 4.
Diagram základních tříd programu. Instalace programu. . . . . . . . . . Hlavní okno programu. . . . . . . . Měřítko výkresu. . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
6 20 21 21
Tloušťky čar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formáty výkresů . . . . . . . . . . . . . . . . . . . . . . . . . . .
26 27
Seznam tabulek 1. 2.
4
1.
Úvod
Úkolem bakalářské práce je vytvořit program pro rýsování. Při rýsování se stejně jako ve skutečnosti bude používat tužka, pravítko, kružítko, úhloměr a guma. Jde o převedení rýsování, jak jej známe ze základní školy, do počítačové formy. Konstrukci grafických objektů je třeba co nejvíce přiblížit reálnému rýsování. Narozdíl od CAD programů, kde je konstrukce grafického objektu maximálně zjednodušena, je zde důležitý i samotný proces tvorby grafického objektu. Počítačově vytvářený výkres má navíc usnadnit práci využitím funkcí, které nejsou při reálném rýsování možné. Jde hlavně o přiblížení a oddálení výkresu, krok zpět, krok vpřed, zjištění úhlu natočení pravítka a kružítka, přesný odpočet poloměru kružítka, zjednodušení psaní textu pomocí textového pole. Jelikož program budou používat žáci základních a středních škol, je třeba brát ohled na uživatele s téměř žádnými nebo základními znalostmi počítačů. Proto je třeba vytvořit jednoduché a srozumitelné ovládání programu. Program vytvořím pro operační systém Windows. Druhá kapitola obsahuje programátorskou dokumentaci, kde si popíšeme hlavní části programu a důležité metody významných tříd. Ve třetí kapitole je popsána instalace programu a uživatelská příručka.
5
2.
Programátorská dokumentace
V této kapitole se budeme zabývat strukturou programu a popíšeme si hlavní třídy programu. Základní vazby mezi nejdůležitějšími třídami zobrazuje obrázek 1.. Jednotlivé třídy z obrázku si podrobněji rozebereme v dalších částech textu.
Obrázek 1. Diagram základních tříd programu.
2.1.
Použité technologie a nástroje
Bakalářská práce je naprogramována v jazyce C# pro .NET Framework 4. Vývoj a testování probíhalo v operačním systému Windows Vista. Pro ukládání 6
výkresu se používá XML formát. Při načítání uloženého souboru probíhá validace pomocí XML schematu. Součástí programu je knihovna PDFsharp z internetových stránek http://www.pdfsharp.net/ sloužící k exportu výkresu do PDF dokumentu. Dále jsou použity ikony z internetových stránek http://www.iconarchive.com/, http://www.softicons.com/ a http://findicons.com/.
2.2.
Provázání částí programu
Třída Modules zprostředkovává komunikaci objektů, aniž by musely mít referenci jeden na druhého. Instanci získáme pomocí statické metody GApplication.Modules(). Princip činnosti si nejlépe vysvětlíme na příkladu. Předpokládejme, že máme zvolenu funkci Tužka. Při pohybu kurzorem nad rýsovací pomůckou chceme zjistit, zda pomůcka umí použít tužku (pravítko ano, kružítko a úhloměr ne). Pokud ano, potřebujeme předat řízení nějakému objektu, který ví, jak rýsovací pomůcka tužku používá. Jeden ze způsobů je, že sám objekt reprezentující rýsovací pomůcku bude vědět, jestli umí tužku použít. Potom bude obsahovat potřebnou metodu nebo bude mít referenci na příslušný objekt. Tento způsob je poměrně komplikovaný. V případě, že budeme chtít rýsovacím pomůckám přidat další činnost, budeme muset projít kód všech tříd s rýsovacími pomůckami a přidat příslušné části pro novou činnost. Druhou možností je mít sadu objektů pro rýsovací pomůcky a k nim další sadu objektů, které budou reprezentovat činnosti prováděné s rýsovacími pomůckami. Provázaní těchto objektů nám zabezpečuje právě instance třídy Modules. Pokud chceme používat tužku společně s určitou rýsovací pomůcku, nejprve vytvoříme rozhraní (případně třídu, od které bude dědit) pro zjištění, jestli rýsovací pomůcka může tužku použít (PencilUseable). Pomocí metody Register(Type type, Type resultType, Object resultObject) objektu Modules svážeme rýsovací pomůcku s objektem implementujícím potřebné rozhraní. Stejným způsobem vytvoříme rozhraní (předka třídy), které zajistí použití tužky s rýsovací pomůckou (UsePencil). V části programu, kde se bude rozhodovat o tom, zda rýsovací pomůcka může použít tužku, použijeme metodu Get(Type type, Type resultType) objektu Modules k získání obslužného objektu. Pomocí něhož zjistíme, zda rýsovací pomůcka umí tužku použít. A dále k získání objektu, který toto použití zprostředkuje. Pokud metoda vrací null, znamená to, že neexistuje obsluha pro objekt. Výhoda tohoto řešení spočívá v tom, že pokud přidáme další funkčnost pro rýsovací pomůcku, nemusíme editovat existující kód, ale vytvoříme novou třídu s patřičným rozhraním, která funkčnost vykonává.
7
Třída Modules Namespace Geometry.Application Object Get(Type type, Type resultType) [public] Vrátí zaregistrovaný objekt pro typ type a resultType. Pokud byl objekt registrován metodou RegisterDynamic, vrátí novou instanci registrované třídy. V případě, že není objek zaregistrován, vrací null. bool IsRegistered(Type type, Type resultType) [public] Zjistí, jestli má resultType pro type zaregistrován objekt. bool IsRegisteredDynamic(Type type, Type resultType) [public] Zjistí jstli má resultType pro type zaregistrován typ objektu. Register(Type type, Type resultType, Object resultObject) [public] Pro objekt type a interface objectInterface zaregistruje obslužný objekt resultObject. Pokud resultObject není typu resultType (neimplementuje rozhraní nebo není dědicem), vyhodí vyjímku ArgumentException. RegisterDynamic(Type type, Type resultType, Type resultObjectType) [public] Pro objekt type a interface resultType zaregistruje obslužný objekt typu resultObjectType. Unregister(Type type, Type objectInterface) [public] Zruší registraci pro type a objectInterface. void UnregisterDynamic(Type type, Type resultType) [public] Zruší registraci pro type a objectInterface.
2.3.
Zpracování událostí v kreslícím okně
V kapitole si ukážeme, jak je v programu vyřešeno ovládání pomocí myši a jak vhodně rozdělit složitější funkce do menších a jednodušších celků. V dalším textu budeme používat následující počeštěné pojmy: Akce je nějaká činnost nebo sled událostí v kreslícím okně. Např. posun pravítka, kreslení oblouku atd. Subakce je akce podřízená nějaké další akci. O nadřízené akci budeme hovořit jako o rodičovské akci, zkráceně rodiči.
8
2.3.1.
Třídy zpracovávající události
Pokud chceme zpracovávat události v kreslícím okně, je třeba vytvořit potomka abstraktní třídy Action. Tato třída poskytuje funkcionalitu pro zpracování událostí v okně, přidání subakce a informování rodiče o úspěšném nebo neúspěšném dokončení subakce. Dále poskytuje přístup k objektům potřebným pro konstrukci výkresu. Jednotlivé události v okně můžeme zpracovávat přepsáním příslušných metod ProcessXX z třídy Action. Informace o ukončení subakce je zajištěna zavoláním metod SubactionFinished(WindowAction subAction) a SubactionError(WindowAction subAction, Point position) podle toho, zda je ukončena bez chyby nebo s chybou. 2.3.2.
Hierarchie akcí
Každou složitější akci je vhodné rozdělit do několika jednodušších částí vykonávajících jen jednu činnost. Např. pro otočení pravítkem máme: 1. Volba středu otočení. 2. Volba pravítka, které chceme otočit. 3. Samotné otočení pravítka. Posloupnost akcí určuje jedna rodičovská akce předávající postupně řízení svým subakcím. Ty mohou zpracovávat požadované události. Jakmile je subakce ukončena, je předáno řízení zpět její rodičovské akci. U výše zmíněného otočení pravítkem proto vytvoříme rodičovskou akci RotateRulerAction, které při inicializaci nastavíme subakci ClickPoint. Ta zajistí volbu středu otáčení pravítka. Nastavení subakce provedeme pomocí zděděné metody SetSubaction(WindowAction action). Po bezchybném ukončení každé subakce je automaticky volána metoda rodičovské akce SubactionFinished(WindowAction subAction), kde z právě ukončené subakce získáme potřebné informace k dalším krokům. Metoda GetPoint() objektu ClickPoint vrátí bod, kam bylo kliknuto myší. Nyní můžeme nastavit další subakci MouseDownSelectRuler sloužící pro výběr otáčeného pravítka. Nakonec nastavíme subakci MouseDownRotate pro provedení samotného otáčení pravítka. Hlavní rodičovské akce (např. výše zmíněnou RotateRulerAkci) spustíme tak, že je vložíme jako parametr SetAction(Action action) objektu ActionManager. Ten je přístupný v atributu actionManager objektu hlavního formuláře. Rozdělení akce na několik subakcí má výhodu v tom, že můžeme jednoduše změnit pořadí, přidat nebo ubrat další subakci. Zabráníme taktéž opakovanému psaní stejného kódu, jelikož nám nic nebrání jednoduché a univerzální akce použít na více místech programu. 9
Abstraktní třída Action Namespace Geometry.Actions void AppendMessage(ActionMessage actionMessage) [public] Metoda volaná při žádosti o vložení textu do příkazového řádku. Vložení provedeme nastavením metodou void Add(String message) argumentu actionMessage. Konstukce textu v příkazovém rádku je popsána v kapitole 2.4.. void Break() [public] Metoda sloužící pro oznámení, že má být akce zvenčí ukončena. Zajistí zavolání stejné medoty na subakci a poté zavolání metody DoBreak(). void DoBreak() [protected virtual] Metoda volaná při ukončování akce zvenčí. Přepsáním se můžeme postarat o potřebný úklid před ukončením akce. void Error() [protecred] Předává další zpracování událostí své rodičovské akci a sděluje jí, že nastala chyba. void Finish() [protecred] Předává další zpracování událostí své rodičovské akci a sděluje jí, že je ukončena bez chyby. Drawing GetDrawing() [public] Vrátí výkres. DrawingArea GetDrawingArea() [public] Vrátí kreslící plochu. DrawingToolBox GetDrawingToolBox() [public] Vrátí kontejner s rýsovacími pomůckami. WindowAction GetParent() [public] Vrátí rodičovskou akci. TmpDrawList GetTmpDrawList() [public] Vrátí objekt pro vykreslování dočasných objektů. UndoRedoManager GetUndoRedoManager() [public] Vrátí objekt pro správu kroku vpřed a vzad.
10
void Initialize() [public virtual] Metoda je určena k přepsání a slouží k inicializaci objektu. V době volání této metody již rodičovský objekt zajistil nastavení potřebných parametrů objektu, proto je vhodné inicializaci přesunout z konstruktoru do této metody. bool IsError() [public] Zjistí, jestli byla akce ukončena s chybou. bool IsFinished() [public] Zjistí, jestli akce požádala o své ukončení. void KeyDown(WindowKeyEventArgs windowKeyEventArgs) [public] Metoda volaná, pokud je stisknuta klávesa. Argument obsahuje kódy stisknutých kláves. void KeyPress(WindowKeyPressEventArgs windowKeyPressEventArgs) [public] Metoda volaná, pokud je stisknuta klávesa. Parametr metody obsahuje znak, který odpovídá stisknuté kombinaci kláves. void KeyUp(WindowKeyEventArgs windowKeyEventArgs) [public] Medoda volaná, pokud je uvolněna klávesa. void Message(String message) [protected] Zajišťuje vypsání zprávy message v příkazovém řádku. void MouseLeftDown(WindowEventArgs windowEventArgs) [public] Metoda volaná, pokud je stisknuto levé tlačítko myši. void MouseUp(WindowEventArgs windowEventArgs) [public] Medoda volaná, pokud je uvolněno tlačítko myši. void MouseMove(WindowEventArgs windowEventArgs) [public] Medoda volaná, pokud je posunuto myší. void MouseWheel(MouseEventArgs e) [public] Medoda volaná, pokud je otočeno kolečkem myši. void ProcessKeyDown(WindowKeyEventArgs windowKeyEventArgs) [protected virtual] Metoda pro zpracování události při stisku klávesy. Z argumentu můžeme získat kód stisknuté klávesy a informaci o tom, jestli byla zároveň stisknuta nějaká kombinace dalších kláves.
11
void ProcessKeyPress(WindowKeyPressEventArgs windowKeyPressEventArgs) [protected virtual] Metoda pro zpracování události při stisku klávesy. Z argumentu můžeme získat znak, který odpovídá kombinaci stisknutých kláves. void ProcessKeyUp(WindowKeyEventArgs windowKeyEventArgs) [protected virtual] Přepsáním této metody můžeme zpracovávat uvolnění klávesy. void ProcessMouseLeftDown(WindowEventArgs windowsEventArgs) [protected virtual] Přepsáním této metody můžeme zpracovávat stisk levého tlačítka myši. void ProcessMouseMove(WindowEventArgs windowEventArgs) [protected virtual] Přepsáním této metody můžeme zpracovávat posun myši. void ProcessMouseLeftUp(WindowEventArgs windowEventArgs) [protected virtual] Přepsáním této metody můžeme zpracovávat uvolnění tlačítka myši. void ProcessMouseWheel(MouseEventArgs e) [protected virtual] Přepsáním této metody můžeme zpracovávat událost otočení kolečka myši. void RepeatEvent() [virtual public] Používáme v případě, že nastavíme novou subakci a potřebujeme, aby znovu zpracovala aktuální událost. void ResetMessage() [public virtual] Odstraní text z příkazového řádku. void SetDrawing(Drawing drawing) [public] Nastaví výkres. void SetDrawingArea(DrawingArea drawingArea) [public] Nastaví kreslící plochu. void SetDrawingToolBox(DrawingToolBox drawingToolBox) [public] Nastaví kontejner s rýsovacími pomůckami. void SetParent(WindowAction parent) [public] Nastaví rodičovskou akci. SetSubaction(Action subaction) [public] Nastaví novou subakci a předá jí řízení.
12
void SetTmpDrawList(TmpDrawList tmpDrawList) [public] Nastaví objekt pro správu vykreslování dočasných objektů. void SetUndoRedoManager(UndoRedoManager undoRedoManager) [public] Nastaví objekt pro správu kroku zpět a vpřed. void SubactionError(WindowAction subAction, Point position) [protected virtual] Metoda určená k přepsání. Je volána poté, co v subakci nastane chyba. void SubactionFinished(WindowAction subAction) [protected virtual] Metoda určená k přepsání. Je volána poté, co je subakce bezchybně ukončena. Třídy WindowKeyEventArgs a WindowKeyPressEventArgs používané v argumentech událostí obsahují informace o stisknutých tkačítkách myši, stisknutých klávesách a poloze myši při událostech.
2.4.
Výkres a grafické objekty
Třída Drawing Třída reprezentuje výkres. V konstruktoru je možné nastavit orientaci a jednu z velikostí A3, A4 nebo A5. Souřadnice jsou udávány v mm s počátkem v levém dolním rohu výkresu. Do výkresu můžeme pomocí přetížené metody void Add() vložit grafické objekty pro úsečku, oblouk, kružnici, bod a text. Rozhraní GeometryObject Toto rozhraní musí implementovat všechny geometrické objekty. Rozhraní je prázdné a slouží pro možnost vkládání geometrických objektů do kolekcí nebo v případě, pokud nepotřebujeme odlišovat jednotlivé geometrické objekty. Rozhraní GeometryObject přímo implementují grafické objekty DrawingText pro text a DrawingPoint pro bod. Abstraktní třída Curve Přidává geometrickému objektu nastavení pro vlastnosti kreslené čáry. Obsahuje medodu void CloneCurveSetting(Curve curve) pro zkopírování nastavení z jiného objektu. Metoda bool EqualsCurveSetting(Curve curve) porovnává nastavení dvou objektů. Z této třídy dědí Line pro úsečku, Arc pro oblouk a Circle pro kružnici.
13
Třída DrawingArea Třída reprezentuje kreslící plochu s výkresem. Zabezpečuje posun, přiblížení a oddálení výkresu. Používá se pro přepočet souřadnic a vzdáleností mezi výkresem a oknem programu. Souřadnice okna jsou v px a souřadnice výkresu jsou v mm. Dále obsahuje metody k překreslení okna a změny tvaru kurzoru. Namespace Geometry.Application DrawingArea(Drawing drawing, Panel panel, DrawingToolBox drawingToolBox, ScrollBar hScrollBar, ScrollBar vScrollBar, TrackBar zoomTrackBar) Parametry Drawing drawing Výkres. Panel panel Formulářový panel. DrawingToolBox drawingToolBox Kontejner pro rýsovací pomůcky. ScrollBar hScrollBar Horizontální scrollbar pro výkres. ScrollBar vScrollBar Vertikální scrollbar pro výkres. TrackBar zoomTrackBa Posuvník pro změnu velikosti výkresu. bool CanZoomIn() [public] Zjistí, jestli je možné výkres přiblížit. bool CanZoomOut() [public] Zjistí, jestli je možné výkres oddálit. Point GetCursorPosition() [public] Pozice kurzoru v souřadnicích okna. PointF GetDrawingCursorPosition() [public] Pozice kurzoru v souřadnicích výkresu. DrawingToolBox GetDrawingToolBox() [public] Kontejner s rýsovacími pomůckami. Graphics GetGraphics() [public] Objekt Graphics získaný z objektu Panel. 14
void MoveDrawing(Size size) [public] Posune výkres o vzdálenost size. void NewDrawing(Drawing drawing) [public] Metoda pro nastavení nového výkresu. void panel ClientSizeChanged(object sender, EventArgs e) [public] Zpracovává událost při změně velikosi okna. void Refresh() [public] Zařídí překreslení okna. void ReserCursor() [public] Nastaví defaultní kurzor pro panel. void SetCursor(Cursor cursor) [public] Nastaví kurzor pro panel. PointF ToDrawingCoordinates(Point point) [public] Přepočítá pozici bodu ze souřadnic okna do souřadnic výkresu. float ToDrawingSize(int size) [public] Přepočítá vzdálenost z okna do výkresu. SizeF ToDrawingSize(Size size) [public] Přepočítá vzdálenost z okna do výkresu. Point ToWindowCoordinates(float x, float y) [public] Přepočítá souřadnice výkresu do souřadnic okna. Point ToWindowCoordinates(PointF point) [public] Přepočítá pozici bodu ze souřadnic výkresu do souřadnic okna. int ToWindowSize(float size) [public] Přepočítá vzdálenost z výkresu do okna. Size ToWindowSize(SizeF size) [public] Přepočítá vzdálenosti z výkresu do okna. Vector ToWindowVector(Vector vector) [public] Přepočítá vektor ze souřadnic okna do souřadnic výkresu. bool ZoomIn() [public] Přiblíží výkres. void ZoomOut() [public] Oddálí výkres. 15
Třída DrawingToolBox Třída reprezentuje kontejner s rýsovacími pomůckami. Implementuje rozhraní IEnumerable, takže můžeme procházet pomůckami pomocí foreach. Rýsovací pomůcky jsou v kontejneru umístěny jako spojový seznam. Nová je vložena na konec seznamu. Pokud je rýsovací pomůcka zvýrazněna metodou Select(DrawingTool drawingTool), pak je přesunuta na začátek seznamu. To má význam v případě, kdy je pod kurzorem umístěno více pomůcek přes sebe, a my požadujeme, aby byla vždy na začátku ta posledně používaná (zvýrazněná). Třída ActionMessage Zajišťuje zobrazování příkazů v příkazovém řádku. Výsledná podoba příkazu se konstruuje tak, že v každé akci máme možnost přepsáním metody AppendMessage(ActionMessage actionMessage) vložit požadovanou část příkazu pomocí metody actionMessage.Add(String message). Akce poté automaticky volá stejnou metodu na svou subakci. Výsledný příkaz je postupně skládán tak, že vlevo je část z hlavní akce a vpravo pokračují příkazy vložené subakcemi. Vypsání příkazu je spuštěno voláním metody Message(String string) objektu Action. V argumentu může být i prázdný řetězec, v tom případě se tato část ignoruje a příkaz končí částí vloženou rodičovskou akcí.
2.5.
Rýsovací pomůcky
Abstraktní třída DrawingTool Obsahuje základní funkčnosti pro rýsovací pomůcky. Z této třídy dědí Ruler pro pravítko, Compass pro kružítko, Protractor pro úhloměr a Eraser pro gumu. Délkové jednoty v třídě DrawingTool a jejich potomcích jsou v mm vzhledem k počátku souřadnic ve výkrese. Namespace Geometry.DrawingTools Implementuje Moveable void doMove(float deltaX, float deltaY) [protected virtual] Metoda určená o přepsání, posunuje rýsovací pomůcku o deltaX, deltaY. State GetState() [public abstract] Vrátí stav objektu.
16
bool IsSelected() [public] Zjistí, jestli je rýsovací pomůcka zvýrazněná. void Move(float deltaX, float deltaY) [public] Posune rýsovací pomůcku o deltaX, deltaY. void Move(Vector delta) [public] Posune rýsovací pomůcku o vektor delta. SelectEvent OnDeselect [public] Událost volaná po odstranění zvýraznění. SelectEvent OnSelect; [public] Událost volaná po zvýraznění. void Select(bool select) [public] Zvýrazní rýsovací pomůcku. void SetState(State state) [public abstract] Nastaví stav objektu.
2.6.
Vykreslování objektů do okna
O vykreslování grafických objektů do okna se stará třída PaintManager. Pro vykreslení výkresu a jeho součástí používá třídy zděděné z abstraktní třídy GraphicObject. Každá taková třída přepisuje metodu public abstract void Draw(DrawingArea drawingArea, GeometryObject geometryObject, Graphics graphics), která má za úkol vykreslit požadovaný objekt. Z abstraktní třídy GraphicDrawingTool dědí třídy vykreslující rýsovací pomůcky. Zde je pro vykreslování použita metoda public abstract void Draw(DrawingArea drawingArea, DrawingTool drawingTool, Graphics graphics). Provázání objektu výkresu nebo rýsovací pomůcky s objektem, který se používá pro vykreslení, je provedeno pomocí třídy Modules popsané v kapitole 2.2..
2.7.
Uložení a export výkresu
Pokud chceme ukládat nebo exportovat výkres, použijeme k tomu třídu Exporter a její jedinou metodu void Export(Export export, Drawing drawing). Exporter postupně volá metody objektu parameteru export pro uložení jednotlivých částí výkresu.
17
Rozhraní Export Namespace Geometry.ExportImport void Start(Drawing drawing) Metoda volaná jako první při exportu. void Point(DrawingPoint point) Metoda pro export bodu. void Line(Line line) Metoda pro export úsečky. void Arc(Arc arc) Metoda pro export oblouku. void Circle(Circle circle) Metoda pro export kružnice. void Text(DrawingText text) Metoda pro export textu. void End() Metoda volaná jako poslední při exportu.
2.8.
Načtení výkresu
Před zpracováním XML souboru proběhne nejprve validace pomocí schematu Resources.validation schema.xml. Pokud je soubor validní, proběhne načtení výkresu do programu. Schema je zobrazeno v příloze A.. Načtení výkresu má na starosti třída Loader s jedinou veřejnou metodou Drawing Load(Stream stream). V parametru stream je objekt typy Stream s XML souborem.
18
3.
Uživatelská příručka
3.1.
Požadavky na systém
Minimální konfigurace počítače: Operační systém: Windows XP SP3, Windows Vista SP1, Windows 7 Procesor: Pentium 1 GHz nebo rychlejší Paměť: minimálně 512 MB paměti RAM Pro spuštění programu je třeba mít na počítači nainstalovaný .NET Framework minimální verze 4. Pokud chybí, bude nabídnuta jeho instalace v průběhu instalace programu.
3.2.
Instalace
Instalaci spustíme souborem setup.exe. Instalační program vás postupně provede po krocích celou instalací. Při instalaci je potřeba odsouhlasit licenční podmínky a zvolit adresář, kam se program nainstaluje. Postup instalace je znázorněn na obrázcích 2.. K běhu programu je potřeba mít na počítači nainstalovaný .NET Framework minimální verze 4. Pokud chybí, provede vás instalátor i touto instalací. Po úspěšném dokončení instalace bude možné program spustit přes zástupce na ploše nebo z nabídky programů.
3.3.
Hlavní okno
Základní ovládání programu Právě prováděnou funkci ukončíme pravým tlačítkem myši nebo stiskem klávesy Esc. Měřítko zobrazení Toolbar: Menu: Editace > Zmenšit, Editace > Zvětšit Klávasová zkratka: Ctrl+−, Ctrl++
19
Obrázek 2. Instalace programu. Posuvník: při najetí myší nad hodnotu měřítka ve spodním levém rohu hlavního okna se zobrazí posuvník, pomocí kterého je možné měřítko změnit. Kolečko myši: otáčením nahoru se výkres zvětšuje, otáčením dolů se výkres zmenšuje. Aby se s výkresem lépe pracovalo, umožňuje zvětšení nebo zmenšení. Funkci používáme v případě, že požadujeme vidět část výkresu v dostatečné velikosti. Aktuální měřítko výkresu se zobrazuje ve spodním levém rohu hlavního okna. Při změně měřítka dochází ke zvětšení nebo zmenšení výkresu pouze vzhledem k pracovní ploše. Skutečné rozměry výkresu zůstávají zachovány. Posun výkresu Má-li výkres nastavené měřítko, při kterém se celý nevejde na pracovní plochu, je možné ho posunout tak, aby byla vidět požadovaná část. Vejde-li se výkres celý na pracovní plochu, je umístěn uprostřed a nejde s ním posouvat. • V oblasti výkresu stiskneme levé tlačitko myši. Pohybem myší můžeme přesunout výkres na zvolené místo. 20
Obrázek 3. Hlavní okno programu.
Obrázek 4. Měřítko výkresu. • Pokud je možné výkresem posouvat, zobrazí se na pravé a spodní straně okna posuvníky, pomocí nichž posuneme výkres do požadované polohy. Posun rýsovacích pomůcek • Přesuneme kurzor myši nad rýsovací pomůcku. • Stiskem levého tlačítka myši a táhnutím přesuneme rýsovací pomůcku na požadované místo. • Po uvolnění tlačítka zůstává rýsovací pomůcka na svém místě.
21
Otočení rýsovací pomůcky • Přesuneme kurzor myši nad rýsovací pomůcku. • Stiskem klávasy Ctrl a levého tlačítka myši a táhnutím otočíme rýsovací pomůckou. Pravítko se otáčí kolem středu stupnice, kružítko kolem jehly a úhloměr kolem středu. • Po uvolnění tlačítka zůstává rýsovací pomůcka otočena. Nastavení poloměru kružítka • Přesuneme kurzor myši nad kružítko. • Stiskem klávesy Alt levého tlačítka myši a táhnutím nastavíme požadovaný poloměr. Odstranění rýsovací pomůcky Máme-li označenu rýsovací pomůcku, při stisku klávesy Delete je tato pomůcka odstraněna z pracovní plochy. Vlastnosti rýsovacích pomůcek Pokud máme označené kružítko, v toolbaru vidíme jeho aktuálně nastavený typ, tloušťku a barvu kresleného oblouku. Tyto vlastnosti můžeme libovolně měnit. Krok zpět, krok vpřed Toolbar: Menu: Editace > Zpět, Editace > Vpřed Klávasová zkratka: Ctrl+Z, Ctrl+Y Používáme, pokud zjistíme, že jsme udělali ve výkresu chybu. Krok zpět odvolává poslední změnu (kreslení, mazání) ve výkresu. Krok vpřed odvolává krok zpět, takže přidá posledně odvolanou akci. Krok můžeme použít cyklicky několikrát po sobě. Kroky se vztahují pouze k akcím prováděným ve výkrese. Nevztahují se na práci s rýsovacími pomůckami nebo na posun či změnu měřítka výkresu.
22
3.4.
Rýsovací pomůcky
Vložení pravítka, kružítka, úhloměru Toolbar: Menu: Nástroje > Pravítko, Nástroje > Kružítko, Nástroje > Úhloměr Klávasová zkratka: Ctrl+R, Ctrl+K, Ctrl+U Rýsovací pomůcka se vloží k bodu označeného myší. Pravítko nulovou ryskou, kružítko jehlou a úhloměr středem. Odstranění pravítka, kružítka, úhloměru Toolbar: Menu: Nástroje > Odstranit pravítko, Nástroje > Odstranit kružítko, Nástroje > Odstranit úhloměr Odstraní se rýsovací pomůcka, na kterou klikneme levým tlačítkem myši. Otočení pravítka Toolbar: Menu: Nástroje > Otočit pravítko Klávesová zkratka: Alt+R • Zvolíme bod, kolem kterého se bude pravítko otáčet. • Myš přesuneme nad pravítko. • Stiskem levého tlačíta myši a posunem otáčíme pravítkem. • Uvolníme tlačítko myši.
23
Otočení kružítka Toolbar: Menu: Nástroje > Otočit kružítko Klávesová zkratka: Ctrl+K • Kružítko se otáčí kolem bodu, kde je umístěna jehla. • Myš přesuneme nad kružítko. • Stiskem levého tlačíta myši a posunem otáčíme kružítkem. • Uvolníme tlačítko myši. Nastavení poloměru kružítka Toolbar: Menu: Nástroje > Nastavit poloměr Klávesová zkratka: Alt+P • Myš přesuneme nad kružítko. • Stiskem levého tlačíta myši a posunem můžeme pohybovat tuhou kružítka. • Uvolníme tlačítko myši. Otočení úhloměru Toolbar: Menu: Nástroje > Otočit úhloměr Klávasová zkratka: Alt+U • Úhloměr se otáčí kolem svého středu označeného ryskou. • Myš přesuneme nad úhloměr. • Stiskem levého tlačíta myši a posunem otáčíme úhloměrem. • Uvolníme tlačítko myši. 24
Tužka Tužka se používá ke kreslení bodu nebo úsečky. Pokud máme zvolenu pomůcku tužka, změní se kurzor na tvar tužky. Toolbar: Menu: Nástroje > Tužka Klávasová zkratka: Ctrl+T Kreslení bodu • Zvolíme akci tužka. • Kliknutím levým tlačítkem myší se na požadovaném místě vykreslí bod. Bod je znázorněn křížkem a kreslí se plnou tenkou čarou, na kterou nemá vliv nastavení tužky. Kreslení úsečky • Pro kreslení úsečky je třeba mít na pracovní ploše vložené pravítko. • Zvolíme akci tužka. • Úsečku je možné kreslit podél hrany pravítka se stupnicí. Přiblížíme-li se kurzorem k této hraně, pravítko se zvýrazní. • Stiskem levého tlačítka myši zvolíme počáteční bod úsečky. Posunem myši podél pravítka vidíme kreslenou část. • Uvolněním tlačítka myši zvolíme koncový bod úsečky. Vlastnosti tuhy U tužky a tuhy kružítka lze změnit tloušťku, typ a barvu kreslené čáry. Aktuální nastavení je vidět v toolbaru. Tloušťky čar používané při tisku shrnuje tabulka 1. Typ a tloušťka čáry Toolbar: Menu: Nastavení > Tuha Klávasová zkratka: Ctrl+E 25
Tabulka 1. Tloušťky čar Typ čáry Tloušťka [mm] Tenká 0.25 Střední 0.5 Tlustá 1
Barva čáry Toolbar: Menu: Nastavení > Barva Klávasová zkratka: Ctrl+B V ikonce toolbaru se spodní část zbarvuje podle aktuálně nastavené barvy. Psaní textu Toolbar: Menu: Nástroje > Text Klávasová zkratka: Ctrl+A • Zvolíme místo, kam se umístí levý dolní roh textu. • Ve výkresu se objeví kurzor a je možné psát text. • Ukončení psaní provedeme klávesou Enter nebo ukončením funkce. Editace textu • V hlavním okně klikneme na text, který chceme editovat. • Za textem se objeví kurzor a je možné text upravit podle potřeb. • Ukončení editace provedeme klávesou Enter nebo ukončením funkce.
26
Guma Toolbar: Menu: Nástroje > Guma Klávasová zkratka: Ctrl+G Guma slouží k umazání nakreslených částí výkresu. Text mazat nejde, k odstranění nebo změně použijeme funkci editace textu. • Guma je v kreslícím okně reprezentována šedým kruhem. • Přesuneme gumu nad část výkresu, kterou chceme vymazat. • Stiskem levého tlačítka myši a táhnutím se budou mazat objekty pod gumou.
3.5.
Nastavení, uložení, načtení a export výkresu
Nový výkres Toolbar: Menu: Soubor > Nový. . . Klávesová zkratka: Ctrl+N Při vytváření nového výkresu máme možnost zvolit orientaci a formát výkresu. Tabulka 2. Formáty výkresů Formát výkresu Šířka × výška [mm × mm] A5 148 × 210 A4 210 × 297 A3 297 × 420
Uložení výkresu do nového souboru Toolbar: Menu: Soubor > Uložit jako. . . Klávesová zkratka: Ctrl+Shift+S 27
Uložení výkresu Toolbar: Menu: Soubor > Uložit Klávesová zkratka: Ctrl+S Uloží změny do aktuálně otevřeného souboru. Pokud nebyl výkres otevřen nebo zatím uložen, vyvolá se příkaz Uložit jako. Načtení výkresu Toolbar: Menu: Soubor > Otevřit Klávesová zkratka: Ctrl+O Export výkresu do PDF Toolbar: Menu: Soubor > Export > Export PDF. . . Vyexportuje výkres do PDF dokumentu. Vektor výkresu do SVG Toolbar: Menu: Soubor > Export > Export SVG. . . Vyexportuje výkres do vektorového formátu SVG.
28
Závěr V bakalářské práci byl vytvořen program pro podporu rýsování na počítači. K rýsování používáme pravítko, úhloměr, kružítko, gumu a tužku. U tužky a tuhy v kružítku můžeme nastavit barvu, tloušťku a typ kreslené čáry. Psaní textu provádíme pomocí textového pole. U textu jde nastavit barva písma. Text, jako jediná součást výkresu, je zpětně editovatelná. Úsečky, oblouky, kružnice a body je možné odmazávat pomocí gumy. Pro zpřesnění a zpřehlednění rýsování je možné výkres příblížit a oddálit. Abychom nemuseli zbytečně ručně mazat, je možné použít krok zpět a ten odvolat krokem vpřed. Krok zpět a vpřed se vztahuje jen na objekty umístěné ve výkrese, nemá vliv na rýsovací pomůcky nebo na přiblížení a oddálení výkresu. Výsledný výkres můžeme uložit a poté znovu načíst nebo exportovat do formátu PDF a SVG. Pro ukládání byl zvolen formát XML. Rýsování probíhá interaktivně přímo v kreslícím okně. Přímo jde pohybovat rýsovacími pomůckami, přes stisknutou klávesu je možné otáčení a u kružítka i nastavení poloměru. Většina funkcí programu je přístupná přes toolbar nebo klávesovou zkratku, všechny funkce samozřejmě z menu. Do aktuální verze programu se bohužel nevešly některé funkce, které bych určitě zařadil do další verze. Jsou to hlavně nastavení u textu velikost, font a řez. Kreslení by zpřesnilo a usnadnilo uchytávání tužky a rýsovacích pomůcek k důležitým bodům geometrických objektů jako např. průsečíky, koncové body, rysky na pravítku a úhloměru.
29
A.
Validační schema
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="geometry"> <xsd:complexType> <xsd:sequence> <xsd:element name="version"> <xsd:complexType> <xsd:attribute name="v" type="xsd:string" use="required"/> <xsd:element name="drawing"> <xsd:complexType> <xsd:attribute name="orientation" type="orientation" use="required"/> <xsd:attribute name="size" type="drawingSize" use="required"/> <xsd:element name="point" type="point" minOccurs="0" maxOccurs="unbounded"> <xsd:element name="line" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="point" type="point"> <xsd:element name="vector" type="vector"/> <xsd:element name="distance" type="distance"> <xsd:element name="pen" type="pen"> <xsd:element name="arc" minOccurs="0" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="center" type="point"> <xsd:element name="radius" type="radius"> <xsd:element name="start_angle" type="angle"> <xsd:element name="angle" type="angle"> <xsd:element name="pen" type="pen"> 30
<xsd:element name="circle" maxOccurs="unbounded" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element name="center" type="point"> <xsd:element name="radius" type="radius"> <xsd:element name="pen" type="pen"> <xsd:element name="text" maxOccurs="unbounded" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:element name="position" type="point"> <xsd:element name="string" nillable="false" type="xsd:string"> <xsd:element name="height"> <xsd:complexType> <xsd:attribute name="h" type="xsd:float" use="required"/> <xsd:element name="color"> <xsd:complexType> <xsd:sequence/> <xsd:attribute name="r" type="rgb"/> <xsd:attribute name="g" type="rgb"/> <xsd:attribute name="b" type="rgb"/> <xsd:complexType name="point"> <xsd:attribute name="x" type="xsd:float" use="required"/> <xsd:attribute name="y" type="xsd:float" use="required"/> <xsd:complexType name="pen"> 31
<xsd:attribute name="thickness" type="penThickness" use="required"/> <xsd:attribute name="dashstyle" type="penDashStyle" use="required"/> <xsd:attribute name="r" type="rgb" use="required"/> <xsd:attribute name="g" type="rgb" use="required"/> <xsd:attribute name="b" type="rgb" use="required"/> <xsd:simpleType name="orientation"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="Portrait"/> <xsd:enumeration value="Landscape"/> <xsd:simpleType name="drawingSize"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="A5"/> <xsd:enumeration value="A4"/> <xsd:enumeration value="A3"/> <xsd:simpleType name="penThickness"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="Thick"/> <xsd:enumeration value="Middle"/> <xsd:enumeration value="Thin"/> <xsd:whiteSpace value="preserve"/> <xsd:simpleType name="penDashStyle"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="Solid"/> <xsd:enumeration value="Dash"/> <xsd:enumeration value="DashDot"/> <xsd:enumeration value="Dot"/> <xsd:complexType name="radius"> <xsd:attribute name="r" type="xsd:float" use="required"/> <xsd:complexType name="angle"> <xsd:attribute name="a" type="xsd:float" use="required"/> 32
<xsd:complexType name="vector"> <xsd:attribute name="x" type="xsd:float" use="required"/> <xsd:attribute name="y" type="xsd:float" use="required"/> <xsd:complexType name="distance"> <xsd:attribute name="start" type="xsd:float" use="required"/> <xsd:attribute name="end" type="xsd:float" use="required"/> <xsd:simpleType name="rgb"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="0"/> <xsd:maxInclusive value="255"/>
B.
Obsah přiloženého CD
bin/ Instalátor setup.exe programu. V podadresáři Release je přímo spustitelný program. doc/ Dokumentace práce ve formátu PDF a ZIP archiv se zdrojovými texty. src/ Obsahuje ZIP archiv se zdrojovými texty programu pro Visual studio 2010. readme.txt Instrukce pro instalaci a spuštění programu Geometrie včetně požadavků pro jeho provoz. Navíc CD/DVD obsahuje: install/ Instalátor .NET Framework 4. U veškerých odjinud převzatých materiálů obsažených na CD/DVD jejich zahrnutí dovolují podmínky pro jejich šíření nebo přiložený souhlas držitele copyrightu. Pro materiály, u kterých toto není splněno, je uveden jejich zdroj (webová adresa) v textu dokumentace práce nebo v souboru readme.txt.
33