%% LyX 1.1 created this file.  For more info, see http://www.lyx.org/.
%% Do not edit unless you really know what you are doing.
\documentclass[czech]{article}
\usepackage[latin2]{inputenc}
\usepackage{babel}
\usepackage{graphics}

\makeatletter


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands.
\providecommand{\LyX}{L\kern-.1667em\lower.25em\hbox{Y}\kern-.125emX\@}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands.
 
\usepackage{uprojekt}                                                           
\usepackage{epsf}                                                               
                                
\title{Editor Petriho sítí}                                           
\author{Grézl Michal}                                                          
\date{leden 2001}                                                                
\group{Informatika, III.ročník}                                                  
\makeatother                                                                    
\makeatother                                                                    
                                
       

\makeatother

\begin{document}

\maketitle

\abstract{Tento projekt umožňuje snadnou a rychlou editaci Petriho sítí. Je zpracován na platformě WIN32. Umožňuje export do obrázkového formátu EPS. Program pracuje jako ActiveX komponenta. Petriho síť je tvořena třemi základními stavebními kameny. Jsou to místo, přechod a hrana. Místo obsahuje jádra, hrana může být ohodnocena. Program je koncipován jako jednoduchý editor s využitím výstupu v různých koncových editorech, nejen v systému LaTeX, síť lze například vložit i do programu MS Word. Program je zpracován v jazyce C++ v programovacím prostředí Microsoft Visual C++.}

\newpage

\tableofcontents{}

\newpage


\section{Popis a analýza}


\subsection{Úvod}

Bylo zapotřebí řešit problém umístění většího množství obrázků Petriho sítí
do textu pomocí ActiveX. Nejpřijatelnější řešení bylo vytvořit grafický editor,
který by dokázal vytvářet a již existující Petriho sítě nějakým rozumným způsobem
editovat. To vše s možností grafického výstupu do typografického systému \LaTeX{}
prostřednictvím konverze dokumentu do formátu EPS. 


\subsection{Analýza Petriho sítě}

Petriho sítěmi je označována široká třída diskrétních matematických modelů (strojů),
které umožňují popisovat specifickými prostředky řídící toky a informační závislosti
uvnitř modelovaných systémů. Petriho sítě vznikly rozšířením modelovacích možností
konečných automatů. Základním prostředkem popisu změny v modelovacím systému
při použití konečného automatu je pojem stav a přechod mezi stavy. 

V případě Petriho sítí je okamžitý stav konstituován určitými parciálními stavy
spojenými s příslušnými místy sítě. K registrování dosažení jistého parciálního
stavu odpovídajícímu příslušnému místu sítě slouží \emph{značení místa}. 

V případě, že místo modeluje logickou podmínku, pak toto místo obsahuje značku.
V případě, že příslušná podmínka neplatí, pak toto místo značku neobsahuje. 

Provedením přechodu (události) se odeberou značky vstupních míst (přestanou
platit vstupní podmínky) a (vzniknou značky ve výstupních místech (začnou platit
podmínky způsobené touto událostí). 


\subsection{Specifikace problému}

Mělo by se rozhodnout jakým způsobem bude Petriho síť v dokumentu reprezentována.
V zásadě jde o tyto položky: 

\begin{itemize}
\item jak budou vypadat parciální stavy 
\item jak budou zobrazeny události 
\item jak budou popisovány změny jednoho stavu na druhý 
\item jak budou značeny Petriho sítě 
\end{itemize}

\subsection{Parciální stavy}

Parciální stavy, které se nazývají \emph{místa Petriho sítě}, budou reprezentovány
malými kružnicemi. \emph{Značení místa} budou označeny černými tečkami nebo
číslicí při vyšším počtu teček (pro lepší přehlednost). 

\vspace{0.3cm}
{\par\centering \includegraphics{place.eps} \par}


\subsection{Události}

Události, které se nazývají \emph{přechody Petriho sítě}, budou reprezentovány
pomocí obdélníků. 

\vspace{0.3cm}
{\par\centering \includegraphics{transition.eps} \par}


\subsection{Změny stavu}

Změny stavu budou vyjádřeny pomocí šipek. Eventuálně vícenásobná změna se zobrazí
pomocí čísla nad šipkou. 

\vspace{0.3cm}
{\par\centering \includegraphics{edge.eps} \par}
\vspace{0.3cm}


\subsection{Značení Petriho sítě}

Každý \emph{stav Petriho sítě} a každý \emph{přechod Petriho sítě} bude označen
jednopísmenným znakem s indexem. 


\subsection{Editace Petriho sítí}

Petriho sítě se budou editovat myší. Kliknutím levým tlačítkem na ploše dokumentu
si navolím \emph{stavy Petriho sítě} nebo \emph{přechody Petriho sítě} či \emph{hrany}.
Dopředu si na toolbaru určím co chci vytvářet (\emph{stavy}, \emph{přechody},
\emph{text}, \emph{hrany}). Atributy \emph{stavu}, \emph{přechodu}, \emph{textu}
nebo \emph{hrany} se navolí pravým tlačítkem. 


\subsection{Souborové operace}

Nahrávaní a ukládání Petriho sítí na disk bude ve svém vlastním formátu a dokumenty
budou implicitně používat koncovku \emph{{*}.petrinet}. 


\subsection{Export do \LaTeX{}u}

Petriho síť půjde pomocí předdefinovaných maker exportovat do typografického
programu \LaTeX{} prostřednictvím obrázkového formátu EPS.


\subsection{Další funkce editoru}

Po vytvoření Petriho sítě bude umět (po inicializaci sítě) simulovat život Petriho
sítě. Editor se přepne z editačního módu do módu simulace. Uživatel si bude
moci klikat na jednotlivé \emph{přechody Petriho sítě} a ihned uvidí změny v
počtu značek (jader) ve \emph{stavech Petriho sítě}. Kdykoliv bude možno celou
síť uložit do souboru či exportovat do \LaTeX{}u. Dále bude editor podporovat
zadané rozhraní ActiveX.


\section{Uživatelská část}

Nyní se budeme podrobně zabývat možnostmi Editoru postupným projitím položek
menu a dalšími možnostmi, které Editor nabízí. 


\subsection{Hlavní okno Editoru}

\vspace{0.3cm}
{\par\centering \resizebox*{1\columnwidth}{!}{\includegraphics{app.eps}} \par}
\vspace{0.3cm}

Ovládání simulace slouží pro zapínání a vypínání simulačního módu. paleta nástrojů
slouží pro výběr typu editačního nástroje. Vlastní editace se provádí v Editačním
okně.


\subsection{Hlavní menu Editoru}

Budou popsány jen nejdůležitější položky a položky, které se normálně v aplikacích
nevyskytují, MSVC++ vygeneruje standardní menu a u uživatele je předpokládána
znalost rozhraní WINDOWS. Uživatelské menu se mění podle stavu, ve kterém se
program zrovna nachází, pokud položka v menu není, nebo je zašedlá nejde, nebo
by nemělo smysl ji používat.


\subsubsection{Soubor}

\begin{itemize}
\item Export


Uoží dokument ve formátu EPS

\end{itemize}

\subsubsection{Editace}

\begin{itemize}
\item Vyber vše


Vybere všechny objekty

\item Přidej místo


Vybere nástroj pro přidávání míst do dokumentu. 

\item Přidej přechod 


Vybere nástroj pro přidávání přechodů do dokumentu. 

\item Přidej poznámku


Vybere nástroj pro přidávání textu do dokumentu. 

\item Přidej hranu 


Vybere nástroj pro přidávání hran do dokumentu. 

\item Vymazat 


Vybere nástroj pro mazání zvolených objektů. 

\end{itemize}

\subsubsection{Zobraz}

\begin{itemize}
\item Podmenu Zvětšení


Výběr zvětšení či zmenšení dokumentu. Tato položka používá stejné velikosti
jako nástroj \emph{lupa}.

\end{itemize}

\subsubsection{Možnosti}

\begin{itemize}
\item Podmenu Konverzní tabulka


Zobrazí dialog obsluhující vestavěnou tabulku náhrady fontů při exportu do EPS.

\end{itemize}

\subsection{Editační mód}

V tomto módu je umožněna editace dokumentu (\emph{míst}, \emph{přechodů}, \emph{hran},
\emph{textových} \emph{poznámek}). Výběrem z palety nástrojů se určí akce provedená
po stisku levého tlačítka myši. Poklepáním pravým tlačítkem na objekt se zobrazí
dialog, který umožní nastavit jeho atributy. Pravé tlačítko stisknuté nad volnou
plochou v dokumentu zobrazí kontextové menu se základními akcemi editoru.


\subsubsection{Popis jednotlivých nástrojů.}


\paragraph{Výběr objektů}

Pokud je vybrán nástroj \emph{výběru objektů} a uživatel klikne levým tlačítkem
provede se toto:

\begin{itemize}
\item V případě míst, přechodů a poznámek se tyto orámují přerušovaným obdélníkem.
Je to symbol toho, že objekt je označen a připraven pro práci se schránkou.
\item V případě lomených \emph{hran} se zobrazí všechny kontaktní body této hrany
a je umožněno jejich přesouvání. V případě jednoduché \emph{hrany} se také pouze
orámuje přerušovanou čarou.
\item Při kliknutí a tažení se zobrazuje rámeček. Všechny objekty uvnitř budou po
puštění tlačítka označeny.
\end{itemize}

\paragraph{Místo, přechod, poznámka}

Nástroje \emph{místo}, \emph{přechod} a \emph{poznámka} přidají místo, přechod
a textovou poznámku. Při přidání \emph{textové} \emph{poznámky} se nejprve zobrazí
dialog s jejími atributy a kde je možno zadat její obsah.


\paragraph{Lupa}

Nástroj \emph{lupa} cyklicky mění zvětšení. Implementovaná jsou zvětšení 200\%,
300\%, zmenšení 50\% a samozřejmě normální velikost. 


\paragraph{Hrana}

Nástroj \emph{hrana} přidá hranu a to následujícím způsobem: Pokud chce uživatel
přidat jednoduchou hranu, může to udělat dvěma způsoby:

\begin{itemize}
\item Kliknutím na počáteční objekt a táhnutím na koncový, přičemž se interaktivně
zobrazuje tvar hrany.
\item Kliknutím na počáteční a poté na koncový objekt.
\end{itemize}
Pokud chce uživatel přidat lomenou hranu, klikne na počáteční objekt, potom
kliká na místa uzlů hrany a nakonec na koncový objekt. Hrana se postupně vykresluje.
Při stisku pravého tlačítka se vytvářená hrana zruší. Lomená hrana může být
po dokončení vytváření změněna na Bezierovu křivku. Provede se to po stisku
pravého tlačítka nad hranou a zaškrtnutím políčka Bezier v dialogu Atributy
hrany. V současné implementaci se bezierova křivka řídí pouze podle prvních
a posledních dvou uzlů hrany. Z toho plyne i nutnost mít minimálně tyto 4 uzly,
pokud jich má hrana méně, upozorní uživatele chybový dialog na nemožnost provedení
tohoto kroku.


\paragraph{Uzel}

Nástroj uzel slouží pro manipulaci s uzly lomené hrany. Uživatel zvolí nástroj,
stiskne levé tlačítko nad uzlem a táhnutím jej přesune. Při použití lomené hrany
lze zapnout mód, při kterém je vykreslována jako beziérová v menu jejích preferencí.
Potom tento nástroj slouží k editaci řídícího polygonu.


\paragraph{Mazání}

Jeden objekt se vymaže vybráním nástroje mazání (kříž) a stiskem levého tlačítka
nad objektem. Pokud je objekt místo, nebo přechod a jsou na něj navázány nějaké
hrany, pak se tyto vymažou také. Skupinu objektů lze vymazat tak, že se označí
a pak se na ně levým stiskem tlačítka myši použije nástroj mazání.


\subsubsection{Atributy prvků Petriho sítě}

Každý objekt má své atributy, které se dají nastavit po stisku pravého tlačítka
myši nad objektem. Jmenovitě jsou to tyto:


\paragraph{Místo}

Místo má tyto měnitelné atributy: Barva, velikost, počet jader, maximální počet
jader, popiska, font a velikost fontu popisky.

\vspace{0.3cm}
{\par\centering \includegraphics{placedlg.eps} \par}
\vspace{0.3cm}


\paragraph{Přechod}

Přechod má tyto měnitelné atributy: Barva, velikost, tvar, popiska, font a velikost
fontu popisky.

\vspace{0.3cm}
{\par\centering \includegraphics{transitiondlg.eps} \par}
\vspace{0.3cm}


\paragraph{Hrana}

Místo má tyto měnitelné atributy: Ohodnocení, bezierova křivka.

\vspace{0.3cm}
{\par\centering \includegraphics{edgedlg.eps} \par}
\vspace{0.3cm}


\paragraph{Text}

Textová poznámka má tyto měnitelné atributy: Text, font a velikost fontu jimž
je vykreslena.

\vspace{0.3cm}
{\par\centering \includegraphics{textdlg.ps.eps} \par}
\vspace{0.3cm}


\subsection{Simulační mód}

V tomto módu se provádí řízená simulace života \emph{Petriho sítě}. Kliknutím
levým tlačítkem myši na proveditelný \emph{přechod} se tento \emph{přechod}
provede. To znamená, že ze všech \emph{míst}, ze kterých vycházejí hrany do
tohoto \emph{přechodu} se odebere počet \emph{jader} podle ohodnocení hrany
a do všech \emph{míst}, do kterých vedou hrany z tohoto \emph{přechodu} se přidá
počet \emph{jader} podle ohodnocení hrany. Jsou zachována všechna omezení daná
funkčností Petriho sítě. 


\subsection{Export do EPS, \LaTeX{}u}

Po zadání názvu souboru se provede konverze a export do formátu EPS. Provede
se také konverze fontů podle vnitřní tabulky programu. Tento krok je nutný důvodu
různých písem používaných v systému \TeX{} a v systému Windows. Pokud je nutno
převést obrázek na platformu s jiným kódováním znaků, je nutno převod řešit
externím konvertorem. Toto řešení jsem zvolil z důvodu existence mnoha kvalitních
programů pro převod kódování znaků. EPS je formát textový a je proto zcela bezpečné
provádět převod takovýmito pomůckami. 

ActiveX metoda vracející kód v \LaTeX{}u provede export do uživatelem zvoleného
souboru a poté volajícímu programu vrátí \LaTeX{}ový kód umožňující vložit tento
obrázek. Při vložení zkopírovaných objektů do jiného programu se postupuje podle
známých postupů editace vložených OLE dokumentů.

Na následujícím obrázku je ukázka dialogu, ve kterém uživatel nastavuje shodné
fonty pro export.

\vspace{0.3cm}
{\par\centering \includegraphics{konverzedlg.eps} \par}
\vspace{0.3cm}


\section{Programátorská část}

K softwarovému zpracování bylo zadáno zpracování na platformě WIN32 a programovací
jazyk Microsoft Visual C++ s využitím objektové knihovny MFC (\emph{Microsoft
Foundation Classes}), která umožňuje zapouzdření API funkcí platformy Windows
do objektových typů v C++ (podle knihy \cite{virius}). Nezmiňuji se zde přímo
o MS Windows, protože program byl také testován ve WINE, což je implementace
WIN API v operačním systému Linux.

Pro vygenerování kostry této aplikace byl použit \emph{AppWizard}, který je
součástí Microsoft Visual C++ a který ušetřil hodně práce. Základní kostra -
rámec - aplikace byla vytvořena jako MDI (\emph{Multiple document} - pro více
dokumentů) s podporou automation a ActiveX. 


\subsection{Popis tříd vytvořených \emph{AppWizardem}}

\emph{AppWizard} vygeneroval tyto třídy: 

\begin{itemize}
\item CPetriApp 
\item CMainFrame 
\item CChildFrame 
\item CPetriDoc 
\item CPetriView 
\item CAboutDlg 
\end{itemize}

\subsubsection{Třída \emph{CPetrinetApp}}

Tato třída zapouzdřuje všechny funkce, které umožňují aplikaci spouštět a ukončovat.
Dále provádí tyto činnosti: 

\begin{itemize}
\item v MDI aplikaci vytvoří hlavní okno 
\item umožňuje zařazení a uvolnění aplikace v seznamu aktivních oken aplikací 
\item zpracuje příkaz pro otevření dokumentu nebo otevře prázdný dokument 
\end{itemize}

\subsubsection{Třída \emph{CMainFrame}}

Instance této třídy poskytuje možnost vytvoření většího množství dětských oken.
Přičemž vytvoření dětského okna je podmíněno zprávou, která je vyvolána uživatelem. 


\subsubsection{Třída \emph{CChildFrame}}

Je vkládána do seznamu dětských oken, jehož správcem je třída \emph{CMainFrame},
která se stará o správu a přidělování práv aktivnímu dětskému oknu. 


\subsubsection{Třída \emph{CPetrinetDoc}}

Tato třída je třída dokumentová a má na starosti práci s daty v dokumentu. Vždy,
když je potřeba zobrazit data v oknech zavolá tato třída metodu \emph{UpdateView()}
a tím požádá třídu \emph{CPetrinetView} o překreslení okna. Obsahuje pointer
na objekt obsahující všechna data jádra (dále jen hlavní objekt).


\subsubsection{Třída \emph{CPetriView}}

Tato třída je třída pohledová a má na starosti zobrazování dat v oknech. K zobrazování
používá metodu \emph{OnDraw()} a touto metodou překreslí okna, o jejichž překreslení
požádá třída \emph{CPetriDoc}. Kreslící funkce volané v metodě OnDraw() jsou
obsaženy v souboru petrinet\_draw.h a petrinet\_draw.c. K metodám a instancím
v \emph{CPetrinetDoc} se přistupuje pomocí metody \emph{GetDocument()}, tato
metoda zajistí vrácení informací z právě aktivního editačního okna.


\subsubsection{Třída \emph{CAboutDlg}}

Tato třída se stará o dialog \emph{O Aplikaci}


\subsection{Soubory tříd vygenerovaných k jednotlivým dialogům}

Soubory jsou pojmenované prefixem dialog\_ plus jméno objektu, nebo akce, vztahující
se k dialogu. Jsou kompletně vygenerované pomocí MSVC++, jejich obsah je však
pochopitelný i bez znalosti výše zmíněného produktu. Instance tříd odpovídají
prvkům dialogu.


\subsection{Hlavičkové soubory tříd tvořících jádro aplikace}


\subsubsection{defines.h}

Obsahuje konstanty použité v projektu.


\subsubsection{list.h }

Obsahuje implementaci seznamu pomocí template.


\subsubsection{stack.h}

Obsahuje implementaci zásobníku pomocí template.


\subsubsection{petri-core.h}

Třída petri\_net. Základní třída jádra, zapouzdřuje všechny objekty, provádí
nad nimi různé operace. S touto třídou komunikuje manažer, tedy třída \emph{CPetrinetDoc}.


\paragraph{instance:}

\begin{itemize}
\item clist \textless{}place {*}\textgreater{} {*}list\_place - Seznam ukazatelů na
objekt place (místo).
\item clist \textless{}transition {*}\textgreater{} {*}list\_transition - Seznam ukazatelů
na objekt transition (přechod).
\item clist \textless{}hrana {*}\textgreater{} {*}list\_edge - Seznam ukazatelů na
objekt edge (hrana).
\item clist \textless{}note {*}\textgreater{} {*}list\_note - Seznam ukazatelů na
objekt note (textová poznámka).
\item int place\_max\_id - Nejvyšší id ze seznamu place.
\item int transition\_max\_id - Nejvyšší id ze seznamu transition.
\item int hrana\_max\_id - Nejvyšší id ze seznamu edge.
\item int note\_max\_id - Nejvyšší id ze seznamu note.
\item petri\_font {*} fonts - Ukazatel na objekt třídy petri\_font.
\item font\_struct {*}f\_p - Popis fontu užitého při konstrukci nového místa.
\item font\_struct {*}f\_t - Popis fontu užitého při konstrukci nového přechodu.
\end{itemize}

\paragraph{metody:}

\begin{itemize}
\item petri\_net() - Konstruktor.
\item petri\_net() - Destruktor.
\item hrana {*}get\_edge\_by\_id(int) - Vrací pointer na hranu podle jejího id.
\item place {*}get\_place\_by\_id(int) - Vrací pointer na místo podle jeho id.
\item transition {*}get\_transition\_by\_id(int) - Vrací pointer na přechod podle
jeho id.
\item note {*}get\_note\_by\_id(int) - Vrací pointer na poznámku podle její id.
\item int can\_do\_net(int) - Vrací true, pokud je možno aktivovat přechod s id v
parametru.
\item int do\_net(int) - Provede přechod z jednoho p. stavu do druhého v přechodu
id.
\item int do\_all() - Provede automatický přechod, zjistí které přechody je možno
aktivovat a potom je všechny provede.
\item void check\_hrana() - Zkontroluje napojení hrany.
\item int create\_place(int, char{*}, char{*}, int) - Vytvoří nové místo. Parametry:
počet jader, jméno, jméno fontu, velikost fontu. Vrací id nově vytvořeného objektu.
\item int create\_transition(int, char {*}, char {*}, int) - Vytvoří nový přechod.
Parametry: reserved, jméno, jméno fontu, velikost fontu. Vrací id nově vytvořeného
objektu.
\item int create\_hrana(int, char {*}) - Vytvoří novou hranu. Parametry: váha, jméno.
Vrací id nově vytvořeného objektu.
\item int connect(int hrana\_id, int place\_id, int transition\_id, int direction)
- Propojí přechod a místo hranou. Parametry: id hrany, id místa, id přechodu,
směr (viz. defines.h). Tato funkce pracuje pouze s již vytvořenou hranou!
\item int create\_note(int, int, char {*}) - Vytvoří novou poznámku. Parametry: pozice
x, pozice y, text. Vrací id nově vytvořeného objektu.
\item void clear() - Zruší všechny objekty.
\item int get\_edge\_coordinates(hrana {*}, int {*}, int {*}, int {*}, int {*}, int)
- Funkce použitá při exportu, vrací ořezanou úsečku reprezentující hranu. Parametry{}''
pointer na hranu, (parametry předávané odkazem) souřadnice, koeficient zvětšení.
\item int eps\_export(char {*}) - Export do souboru se jménem v parametru.
\item int get\_item\_by\_position(int, int, int {*}, int {*}) - Vrací id objektu a
jeho ty podle pozice. Parametry: pozice x, pozice y, (předané odkazem) id, typ.
\item int get\_node\_by\_position(int, int, int {*}, int {*}) - Vrací true pokud je
nalezen uzel nějaké hrany na zadané pozici. V posledních dvou parametrech je
po návratu uloženo id hrany, pozice uzlu v hraně. Parametry: pozice x, pozice
y, (předané odkazem) id, typ.
\item int delete\_item(int, int) - Smaže objekt. Parametry: id, typ.
\item int delete\_all() - Smaže všechny objekty.
\item void select\_font(petri\_eps{*}, char {*}, int) - Nastaví font pro export objektu
podle fontu objektu, font je převeden podle tabulky fontů, a jeho velikost je
přizpůsobena formátu eps. Parametry: objekt eps, jméno fontu, velikost fontu.
\item void get\_bounding\_box(int{*}, int{*}) - Zjistí oblast pro export.
\end{itemize}

\subsubsection{petri-eps.h}

Třída petri-eps slouží k exportu do EPS. Obsahuje metody, které generují postscriptový
kód pro základní tvary použité v dokumentu jako kružnice, obdélník, text apod.
PS kód se vrací jako char {*}. Třída používá filozofii podobnou WIN API co se
týče barev a fontů, tj. nastaví se jednou a pak se používají dokud nejsou změněny.


\paragraph{instance:}

\begin{itemize}
\item double R - Složka RGB, červená.
\item double G - Složka RGB, zelená.
\item double B - Složka RGB, modrá.
\item int colors - Indikuje zda se generuje šedý, nebo barevný výstup.
\item char {*} font - Jméno fontu.
\item int font\_size - Velikost fontu.
\item int bbox\_x, bbox\_y, bbox\_xx, bbox\_yy - Oblast, kterou zabírá obrázek.
\end{itemize}

\paragraph{metody:}

\begin{itemize}
\item petri\_eps() - Konstruktor.
\item void set\_bounding\_box(int, int) - Nastaví oblast pro obrázek.
\item char {*}prolog() - Vrací postscriptový prolog.
\item char {*}start() - Vrací začátek postscriptového kódu.
\item char {*}start\_page() - Vrací začátek stránky.
\item char {*}end\_page() - Vrací konec stránky.
\item char {*}trailer() - Vrací konec ps souboru.
\item char {*}eps\_ellipse(int x, int y, int xrad, int yrad, int fill) - Vrací kód
pro elipsu.
\item char {*}eps\_text(int x, int y, char {*}text) - Vrací kód pro text.
\item char {*}eps\_box(int x, int y, int xx, int yy, int fill) - Vrací kód pro obdélník.
\item char {*}eps\_normal\_line(int x, int y, int xx, int yy) - Vrací kód pro čáru.
\item char {*}eps\_arrow\_line(int x, int y, int xx, int yy)- Vrací kód pro čáru se
šipkou.
\item char {*}eps\_bezier\_line(int x, int y,int r1, int r2,int r3, int r4, int xx,
int yy) - Vrací kód pro bezierovu křivku.
\item void set\_RGB(double r, double g, double b) - Nastavuje barvu.
\item void enable\_colors() - Zapíná barevný režim.
\item void disable\_colors() - Vypíná barevný režim.
\item int colors\_enabled() - Vrací stav barevného režimu.
\item void set\_font(char {*}) - Nastaví jméno fontu.
\item void set\_font\_size(int) - Nastaví velikost fontu.
\end{itemize}

\subsubsection{petri-font.h}

Tento hlavičkový soubor obsahuje 2 třídy. Třída font\_struct symbolizuje font,
obsahuje jeho jméno a velikost. Třída petri\_font obsahuje konverzní tabulku
fontů a obsahuje metody pro manipulaci s ní.


\paragraph{Třída petri\_font}


\subparagraph{instance:}

clist \textless{}font\_pair{*}\textgreater{} font\_table - Seznam fontů a jejich
ekvivalentů.


\subparagraph{metody: }

petri\_font() - Konstruktor.

char {*} find\_font\_substitute(char {*}) - Metoda nalezne a vrátí náhradu za
font, který je jí dán v parametru.

void set\_font\_pair (char {*}, char {*}) - Nastaví pár font, ekvivalent.


\paragraph{Třída font\_struct}


\subparagraph{instance:}

\begin{itemize}
\item char {*}font - jméno fontu
\item int font\_size - velikost
\end{itemize}

\subparagraph{metody:}

\begin{itemize}
\item font\_struct() - Konstruktor.
\item font\_struct(char {*}, int) - Konstruktor. Parametry: jméno, velikost.
\item font\_struct(font\_struct {*}) - Copy Konstruktor.
\item \textasciitilde{}font\_struct() - Destruktor.
\item char {*}get\_font() - Vrátí jméno.
\item void set\_font(char {*}) - Nastaví jméno.
\item int~ get\_font\_size() - Vrátí velikost.
\item void set\_font\_size(int f) - Nastaví velikost.
\end{itemize}

\subsubsection{petri-graphics.h}

Obsahuje sadu funkcí pro manipulaci s geometrickými objekty. Jsou zde obsaženy
také základní definice bodu a čáry.

\begin{itemize}
\item struct mg\_point - Struktura pro definici bodu.
\item struct mg\_line - Struktura pro definici úsečky.
\item double vector(double, double); - Vrací rozdíl druhého a prvního parametru (tedy
jednu složku vektoru)
\item double line\_length(int, int, int, int) - Vrací velikost úsečky dané parametry.
\item mg\_line clip\_circle(int, int, int, int, int, int) - Vrací ořezanou úsečku.
Ořezání je provedeno vůči kružnici, v jejímž středu je jeden z konců úsečky
dané prvními čtyřmi parametry, pátý parametr je poloměr kružnice a šestý směr
úsečky (tj. jestli v kružnici začíná, nebo končí viz. defines.h)
\item int point\_belongs(mg\_point, mg\_point, mg\_point) - Vrací zda na úsečce definované
prvními dvěma parametry leží bod daný parametrem třetím.
\item mg\_point clip\_liang\_barsky(double x1, double y1, double x2, double y2, double
xw\_min, double yw\_min, double xw\_max, double yw\_max) - Ořeže úsečku v okénku.
Vrátí bod, který je průsečíkem úsečky a obdélníku okénka. První čtyři parametry
definují úsečku, druhé čtyři okénko.
\end{itemize}

\subsubsection{petri-nodes.h}

V tomto hlavičkovém souboru jsou obsaženy třídy pro objekty místo, přechod a
hrana. Jejich obsah popíšu jen slovně. Každá třída obsahuje instance pro své
vlastní atributy: Barvu, velikost, font atd. Místo a přechod obsahují seznamy
příchozích a odchozích hran. Každá hrana obsahuje ukazatele na objekty které
spojuje. Metody jsou funkce pro manipulaci s instancemi. Hrana obsahuje dále
metody pro práci s lomenými čárami. Metody jsou velmi jednoduché a jen vzácně
překračuje délka jejich kódu několik řádků.


\paragraph{Třída \emph{place}}

Tato třída se používá k implementaci \emph{stavů Petriho sítě}. Umožňuje vytváření
a editaci těchto stavů a simulaci životních cyklů \emph{Petriho sítě}. 


\paragraph{Třída \emph{transition}}

Tato třída se používá k implementaci \emph{přechodů Petriho sítě}. Umožňuje
vytváření a editaci těchto přechodů a simulaci životních cyklů \emph{Petriho
sítě}. 


\paragraph{Třída \emph{hrana}}

Tato třída umožňuje vytvářet, navazovat a editovat hrany. Tyto hrany slouží
k logickému propojení \emph{stavů} a \emph{přechodů}, které je potřeba pro znázornění
\emph{Petriho sítě} a pro simulaci životních cyklů \emph{Petriho sítě}. 


\subsubsection{petri-note.h}

Tato metoda obsahuje definici třídy \emph{note}, kterou je popsán objekt dokumentu
textová poznámka. Její struktura je stejná jako třídy v petri-nodes.h. Obsahuje
instance jako text poznámky, pozici, barvu, font, id a metody pro manipulaci
s nimi.


\subsubsection{petri-select.h}

Tato třída zajišťuje manipulaci se seznamem vybraných objektů. Obsahuje seznam
objektů, které se vyberou jedním z možných způsobů (viz. uživatelská část).
Umožňuje také manipulaci, přesun, s vybranými objekty. Při stisku tlačítka myši
je nastavena počáteční pozice. Při pohybu myši se nastavuje diference původní
a aktuální pozice myši. Při puštění tlačítka je přičtena k pozici všech vybraných
objektů. Diference může být samozřejmě i záporná. Tento způsob změny pozice
je mnohem jednodušší, než prostě měnit přímo souřadnice objektů.

\begin{itemize}
\item struct \_selected\_object - Struktura, ze které je složen seznam vybraných objektů.
Obsahuje id, typ a velikost objektu.
\end{itemize}

\paragraph{instance:}

\begin{itemize}
\item int moving\_objects\_status - Je nastavena na 1pokud uživatel hýbe vybranými
objekty.
\item mg\_point moving\_objects\_original\_position - Původní pozice objektů, tedy
ta ke které se vztahuje diference, pozice myši při stisku tlačítka.
\item int moving\_objects\_x\_diff, int moving\_objects\_y\_diff; - Diference pohybu,
tj. rozdíl mezi nynější a původní pozicí myši. Jedna pro souřadnici x, druhá
pro y.
\item mg\_point select\_rectangle\_start - Začátek obdélníku, kterým uživatel vybírá
objekty.
\item mg\_point select\_rectangle\_end - Konec obdélníku, kterým uživatel vybírá objekty
(nelze zde říct který roh to je, protože zde můžou nastat různé situace v závislosti
na kvadrantech).
\item int select\_rectangle\_status - Vrací, zda uživatel právě vybírá objekty.
\item petri\_net {*}net - Ukazatel na hlavní objekt petri\_net (viz. petri-core.h). 
\item clist \textless{} \_selected\_object {*} \textgreater{}{*}selected\_objects
- Seznam vybraných objektů.
\end{itemize}

\paragraph{metody:}

\begin{itemize}
\item petri\_select(petri\_net {*} main\_net) - Konstruktor.
\item \textasciitilde{}petri\_select() - Destruktor.
\item int add\_object\_to\_list\_of\_selected(int, int) - Přidá objekt do seznamu.
Parametry: id, typ.
\item int list\_of\_selected\_first() - Nastaví ukazatel v seznamu objektů na první
a vrací zda jsou v seznamu nějaké položky.
\item int list\_of\_selected\_next() - Nastaví ukazatel v seznamu objektů na další.
\item int list\_of\_selected\_get\_current\_type() - Vrací typ objektu na který zrovna
ukazuje ukazatel v seznamu objektů.
\item int list\_of\_selected\_get\_current\_id() - Vrací id objektu na který zrovna
ukazuje ukazatel v seznamu objektů.
\item mg\_point list\_of\_selected\_get\_current\_position() - Vrací opravdovou pozici
objektu, na který zrovna ukazuje ukazatel v seznamu objektů. Vyžádá si informace
přímo od objektů petriho sítě.
\item int list\_of\_selected\_unselect\_all() - Zruší výběr objektů.
\item int list\_of\_selected\_select\_all() - Vybere všechny objekty v dokumentu.
\item int is\_st\_selected() - Vrací, zda je vybrán nějaký objekt.
\item int items\_selected(int) - Vrací kolek objektů typu parametr je vybráno.
\item int places\_selected() - Počet vybraných míst.
\item int transitions\_selected() - Počet vybraných přechodů.
\item int notes\_selected() - Počet vybraných poznámek.
\item int edges\_selected() - Počet vybraných hran.
\item int move\_selected\_objects() - Přesune vybrané objekty na pozice plus diference.
\item int is\_id\_selected(int, int) - Vrátí, zda je vybrán objekt definovaný parametry:
id, typ.
\item int is\_in(int x, int y) - Zjistí jestli je pozice definovaná parametry uvnitř
obdélníku, kterým uživatel vybírá objekty.
\item int put\_selected\_into\_list\_of\_selected() - Vloží do seznamu objekty, které
se nacházejí uvnitř obdélníku, kterým uživatel vybírá objekty.
\item void set\_moving\_objects\_difference(int, int) - Nastavuje diferenci. Parametry:
x, y - aktuální pozice myši.
\item void delete\_selected() - Smaže fyzicky vybrané objekty, potom je zruší i ze
seznamu.
\item int remove\_from\_list(int id, int type) - Zruší objekt pouze ze seznamu vybraných
objektů.
\end{itemize}

\subsubsection{petri-string.h}

Tento hlavičkový soubor obsahuje několik funkcí pro práci se stringy v pojetí
C, tedy ukončenými 0.

\begin{itemize}
\item char {*}copy(char {*}, int, int) - Vrátí zkopírovaný string, je pro něj naalokováno
potřebné množství paměti. Parametry: zdrojový string, pozice odkud, pozice kam.
\item char {*}ltrim(char {*}) - Ořeže mezery zleva.
\item char {*}rtrim(char {*}) - Ořeže mezery zprava. Obě funkce vrací nově naalokovaný
string.
\end{itemize}

\subsubsection{petri-undo.h}

Třída obhospodařující undo a redo seznamy. Každý jednotlivý stav objektu je
pro jednoduchost ukládán kompletně. Hospodárnější by jistě bylo ukládat například
jen proběhlé akce. To je ovšem velmi náročný způsob na implementaci a paměťové
nároky zvoleného řešení jsou minimální použitím struktur, které naše reálné
objekty pouze abstrahují, neukládají se tedy do paměti kompletní objekty jen
jejich atributy. 


\paragraph{struktury:}

\begin{itemize}
\item struct \_t - Struktura obsahující atributy přechodu.
\item struct \_p - Struktura obsahující atributy místa.
\item struct \_e - Struktura obsahující atributy hrany.
\item struct \_ n- Struktura obsahující atributy textové poznámky.
\end{itemize}

\paragraph{Třída undo\_buffer }

Symbolizuje buffer, do kterého se ukládají stavy editovaného dokumentu.


\subparagraph{instance:}

\begin{itemize}
\item clist \textless{} \_t {*} \textgreater{}{*}t - Seznam přechodů.
\item clist \textless{} \_p {*} \textgreater{}{*}p - Seznam míst.
\item clist \textless{} \_e {*} \textgreater{}{*}e - Seznam hran.
\item clist \textless{} \_n {*} \textgreater{}{*}n - Seznam poznámek.
\item int place\_max\_id - Maximální id všech míst.
\item int transition\_max\_id - Maximální id všech přechodů.
\item int hrana\_max\_id - Maximální id všech hran.
\item int note\_max\_id - Maximální id všech poznámek.
\end{itemize}

\subparagraph{metody:}

\begin{itemize}
\item int prepare\_undo\_structure(petri\_net {*} pnet) - Uloží současný stav dokumentu
do bufferu.
\item petri\_net {*}create\_net\_from\_undo\_structure() - Obnoví (zruší současný
a vytvoří nový, předchozí) dokument z bufferu.
\end{itemize}

\paragraph{Třída undo\_redo}

Tato třída umožňuje manipulaci s zásobníky undo bufferů a redo bufferů. Každý
buffer obsahuje obraz dokumentu. Undo a redo fungují zjednodušeně takto: Při
každé změně dokumentu se stav před ní uloží do undo bufferu. Při akci undo se
nejprve do redo bufferu uloží aktuální stav a poté se z undo bufferu obnoví
stav předchozí. Při redo akci se se uloží do undo bufferu stav aktuální a z
redo bufferu se obnoví stav dokumentu. Je nutné si uvědomit, že buffery jsou
uloženy v zásobníku, který umožňuje operace push pro uložení a pop pro vybrání.


\subparagraph{instance:}

\begin{itemize}
\item petri\_net {*} net - Ukazatel na hlavní objekt.
\item cstack \textless{}undo\_buffer {*}\textgreater{} {*}undo\_stack - Zásobník minulých
stavů, undo.
\item cstack \textless{}undo\_buffer {*}\textgreater{} {*}redo\_stack - Zásobník následujících
stavů, redo.
\end{itemize}

\subparagraph{metody:}

\begin{itemize}
\item undo\_redo(petri\_net {*}) - Konstruktor, jako parametr je zde ukazatel na hlavní
objekt.
\item \textasciitilde{}undo\_redo() - destruktor
\item petri\_net {*}synchronize() - Vrací vnitřní ukazatel na hlavní objekt. Tato
metoda je důležitá, protože při undo nebo redo akci se hlavní objekt zruší a
dokument jej tedy náhle nezná. V metodě do\_undo(), nebo do\_redo() se však
vytvoří znovu z patřičného zásobníku. Prostřednictvím této metody se dokumentu
sdělí nový ukazatel na hlavní objekt. Dokument se po akci {}``synchronizuje{}''.
\item int register\_change(petri\_net{*}) - Uloží aktuální stav dokumentu do zásobníku
undo. Je nutno zavolat tuto metodu \textbf{před} jakoukoliv změnou. Parametr:
ukazatel na hlavní objekt.
\item int do\_undo() - Uloží aktuální stav do redo zásobníku, zruší hlavní objekt
a operací pop ze zásobníku undo získá a vytvoří nový hlavní objekt.
\item int can\_undo() - Vrací, zda je možno provést undo.
\item int can\_redo() - Vrací, zda je možno provést redo.
\item int do\_redo() - Zaregistruje změnu pomocí register\_change(), a vytvoří nový
hlavní objekt ze zásobníku redo.
\end{itemize}

\subsection{Ostatní}


\subsubsection{petrinet\_draw.h}

Tento hlavičkový soubor obsahuje sadu funkcí, které obstarávají veškeré kreslení.
Netvoří žádnou třídu, bylo by to zbytečné. Každá funkce bere jako parametr,
kromě jiných, také ukazatel na DC do kterého bude kreslit. Funkce jsou oddělené
z důvodu portability, jelikož jsou závislé na platformě WINDOWS.


\subsection{Rozhraní ActiveX}

Program je napsán jako ActiveX komponenta, tj. je schopen poskytovat své funkce
jiným programům či komponentám. Rozhraní \verb|ITeXEditor|, které program realizuje,
je společné pro všechny editory realizované jako bakalářský projekt na katedře
informatiky Univerzity Palackého, a tudíž mohou být užity jako komponenty pro
nějaký nadřízený editor \TeX{}u/\LaTeX{}u. Rozhraní obsahuje následující metody
(definice jsou v IDL jazyku): 

\begin{itemize}
\item \verb|HRESULT NewTeXObject([in] BSTR filename)| - vytváří nový dokument editoru. 
\item \verb|HRESULT EditTeXObject([in] BSTR filename)| - otevře specifikovaný, již
existující, dokument v~editoru. 
\item \verb|HRESULT GetInfo([out,retval] BSTR * text)| - vrací informace o~autorovi,
programu apod. 
\item \verb|HRESULT GetTeXSettings([out,retval] BSTR * text)| - vrací \TeX{} nastavení,
která jsou potřeba, aby kód v \TeX{}u/\LaTeX{}u, který komponenta generuje,
byl korektní. 
\item \verb|HRESULT GetTeXText([out,retval] BSTR * text)| - vrací kód v \TeX{}u /
\LaTeX{}u, který popisuje vzhled dokumentu editoru. 
\end{itemize}

\section{Závěr}

V tomto projektu jsem se snažil vytvořit aplikaci, která by měla zpříjemnit
vytváření a editaci Petriho sítí v typografickém prostředí \LaTeX{}, což se
mi doufám podařilo. Aplikace potřebuje k běhu tyto soubory: 

\begin{itemize}
\item Petri.exe - vlastní aplikace 
\item napoveda.htm - nápověda k aplikaci 
\item napoveda.exe - prohlížeč nápovědy
\item ole\_test.exe - soubor k testování ActiveX rozhraní, není potřebný přímo pro
běh aplikace.
\end{itemize}
\newpage



\begin{thebibliography}{1}
\bibitem{andrews}Andrews, Mark: \textit{Programujeme v jazyce Visual C++}. Computer Press, Praha,
1997. 
\bibitem{virius}Virius, Miroslav: \textit{Visual C++ 5.0}. Grada Publishing, Praha, 1997. \end{thebibliography}

\end{document}
