Guest User

Untitled

a guest
Aug 20th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.91 KB | None | 0 0
  1. using System;
  2. using System.Drawing;
  3. using System.Drawing.Drawing2D;
  4. using System.Windows.Forms;
  5.  
  6. namespace GraphForge
  7. {
  8.     /*
  9.      * @brief Klasa wyświetlająca zadany graf w postaci grafu płaskiego
  10.      *
  11.      * @todo Uzupełnić klasę o eventy: edgeClick, vertexClick, voidClick, Click, ...
  12.      * @todo Klasa powinna samodzielnie obsługiwać przeciąganie, skalowanie, .. wierzchołków, krawędzi
  13.      *
  14.      * @author Paweł Kubiak
  15.      * @author ...
  16.      */
  17.  
  18.     public class Renderer2D: IRenderer<Point2D>
  19.     {
  20.         private Panel canvas = null;   //< Obiekt po którym będziemy rysować
  21.         private Graph defaultGraph = null;   //< Graf domyślnie renderowany
  22.         private Layout<Point2D> defaultLayout = null;   //< Domyślny layout
  23.         private int activeMode = 0;//< Aktualny tryb edycji grafu 0-edit, 1-vertex, 2-edge
  24.        
  25.         /*
  26.          * @brief Konstruktor
  27.          *
  28.          * Konstruktor powinien podpinać odpowiednie metody klasy Renderer pod przekazany obiekt:
  29.          *  event MouseDown - do obsługi drag&drop
  30.          *  event MouseUp - do obsługi drag&drop
  31.          *  event MouseClick - klikanie na grafie - prawy, lewy, środkowy przycisk
  32.          *  event Resize
  33.          *  event MouseWheel - ruch kółka zoomuje graf
  34.          *  ...
  35.          *
  36.          * @param canvas - Obiekt po którym będziemy rysować
  37.          */
  38.  
  39.         public Renderer2D (Panel canvas)
  40.         {
  41.             this.canvas = canvas;
  42.             canvas.Paint += GraphDrawHandler;
  43.             canvas.Click += GraphClickHandler;
  44.             canvas.MouseDown += GraphClickHandler;
  45.             canvas.MouseWheel += GraphClickHandler;
  46.         }
  47.        
  48.         /*
  49.          * @brief Konstruktor
  50.          *
  51.          * Konstruktor powinien spróbować podpiąć podany graf i layout jako domyślne.
  52.          *
  53.          * @param canvas - Obiekt po krórym będziemy rysować
  54.          * @param g - Główny graf, który będziemy renderować
  55.          * @param l - Layout określający wygląd renderowanego grafu
  56.          */
  57.  
  58.         public Renderer2D (Panel canvas, Graph g, Layout<Point2D> l): this(canvas){
  59.             this.defaultGraph = g;
  60.             this.defaultLayout = l;
  61.             //canvas.Invalidate();// Odrysuj canvas
  62.         }
  63.        
  64.         /*
  65.          * @brief Ustaw tryb dodawania krawędzi
  66.          *
  67.          * Ustawia tryb w którym kliknięcie na dwa wierzchołki pokoleji spowoduje utworzenie nowej krawędzi skierowanej,
  68.          * kliknięcie w inny obiekt powraca do trybu edycji
  69.          *
  70.          * @param sender -
  71.          * @param e -
  72.          */
  73.         public void SetEdgeMode(object sender, EventArgs e){
  74.             Console.WriteLine("SetEdgeMode");
  75.         }
  76.        
  77.         /*
  78.          * @brief Ustaw tryb dodawania wierzchołków
  79.          *
  80.          * Ustawia tryb w którym kliknięcie na puste miejsce grafu powoduje dodanie w tym miejscu nowego wierzchołka,
  81.          * kliknięcie w innym miejscu przywraca tryb edycji
  82.          *
  83.          * @param sender -
  84.          * @param e -
  85.          */
  86.         public void SetVertexMode(object sender, EventArgs e){
  87.             Console.WriteLine("SetVertexMode");
  88.         }
  89.        
  90.         /*
  91.          * @brief Ustaw tryb edycji grafu
  92.          *
  93.          * Ustawia tryb w którym można przeciągać wierzchołki grafu, a także wyświetlać menu kontekstowe dla wierzchołków i krawędzi
  94.          * @param sender -
  95.          * @param e -
  96.          */
  97.         public void SetEditMode(object sender, EventArgs e){
  98.             Console.WriteLine("SetEditMode");
  99.         }
  100.        
  101.         /*
  102.          * @brief Wyświetla graf g z layoutem l na obiekcie canvas
  103.          *
  104.          * @param canvas - obiekt na którym należy wyświetlić graf
  105.          * @param g - graf do wyświetlenia
  106.          * @param l - layoud grafu g
  107.          *
  108.          * @exception RunTimeException - gdy któryś obiekt jest błędny
  109.          */
  110.         public void Render(Graphics canvas, Graph g, Layout<Point2D> l){
  111.             Console.WriteLine(canvas.VisibleClipBounds);
  112.            
  113.             canvas.FillEllipse(Brushes.Red, 10, 10, 10 ,10);
  114.             canvas.SmoothingMode = SmoothingMode.AntiAlias;
  115.             canvas.Clear(System.Drawing.Color.White);
  116.             foreach(Edge e in g.Edges)
  117.                 canvas.DrawLine(l.Edges[e].Pen, l.Vertices[e.start].Position.Cast(), l.Vertices[e.end].Position.Cast());
  118.            
  119.             foreach(Vertex v in g.Vertices){
  120.                 canvas.FillEllipse(Brushes.Lime, l.Vertices[v].Position.X-0.5f*l.Vertices[v].Radius, l.Vertices[v].Position.Y-0.5f*l.Vertices[v].Radius, l.Vertices[v].Radius, l.Vertices[v].Radius);
  121.             }
  122.             //foreach(
  123.         }
  124.        
  125.         /*
  126.          * @brief Wyświetla graf defaultGraph z użyciem defaultLayout na obiekcie canvas
  127.          *
  128.          * @param canvas - obiekt na którym należy wyświetlić defaultGraph
  129.          *
  130.          * @exception RunTimeException - gdy coś nietak
  131.          */
  132.         public void Render(Graphics canvas){
  133.             Render (canvas, this.defaultGraph, this.defaultLayout);
  134.         }
  135.        
  136.        
  137.         /*
  138.          * @brief Wyświetla g z użyciem l na canvasie
  139.          *
  140.          * @param g - graf do wyświetlenia
  141.          * @param l - layout grafu g
  142.          *
  143.          * @exception RunTimeException - kiedy g, l, canvas są błędne (bo są np. nullami)
  144.          */
  145.         public void Render(Graph g, Layout<Point2D> l){
  146.             Graphics c = this.canvas.CreateGraphics();
  147.             c.TranslateClip(this.canvas.Location.X, this.canvas.Location.Y);
  148.             Console.WriteLine(this.canvas.Top+" "+this.canvas.Left);
  149.             Render (c, g, l);
  150.             c.Dispose();
  151.         }
  152.        
  153.        
  154.         /*
  155.          * @brief Wyświetla defaultGraph z użyciem defaultLayout na canvas
  156.          *
  157.          * @exception RunTimeException - kiedy niemożna użyć defaultGraph, defaultLayout lub canvas (bo są np. nullami)
  158.          */
  159.         public void Render(){
  160.             Render (this.defaultGraph, this.defaultLayout);
  161.            
  162.             /*
  163.             //Przykładowy kod coś rysujący
  164.             g.SmoothingMode = SmoothingMode.AntiAlias;//ustaw wygładzanie lini
  165.             g.DrawLine(new Pen(Color.White, 1.0f), new Point(220,100), new Point(200, 150));//thin
  166.             g.DrawLine(new Pen(Color.White, 2.0f), new Point(220,100), new Point(280, 150));//normal
  167.             g.DrawLine(new Pen(Color.White, 4.0f), new Point(220,100), new Point(360, 150));//bold*/
  168.            
  169.             /*g.FillEllipse(Brushes.Yellow, 90, 90, 20, 20);
  170.             g.FillEllipse(Brushes.Lime, 190, 140, 48, 48);*/
  171.            
  172.             /*g.FillEllipse(Brushes.Lime, 100, 200, 14, 14);//Tiny
  173.             g.FillEllipse(Brushes.Lime, 130, 200, 20, 20);//Small
  174.             g.FillEllipse(Brushes.Lime, 160, 200, 28, 28);//Normal
  175.             g.FillEllipse(Brushes.Lime, 200, 200, 36, 36);//Medium
  176.             g.FillEllipse(Brushes.Lime, 250, 200, 48, 48);//Big
  177.             g.Dispose();*/
  178.            
  179.            
  180.         }
  181.        
  182.         /*
  183.          * @brief Zwraca obiekt, który znajduje się aktualnie w punkcie płaszczyzny p
  184.          *
  185.          * @return Vertex, jeżeli kliknięto vertex
  186.          * @return Edge, jeżeli kliknięto edge
  187.          * @return null, gdy kliknięto pustkę
  188.          */
  189.         private object ClickedItem(Point p){
  190.             return null;   
  191.         }
  192.  
  193.         /*
  194.          * @brief Handler przechwytujący eventy przychodzące z kliknięć na panelu na którym się rysuje
  195.          *
  196.          * W zależności od sposobu kliknięcia i aktywnego trybu podejmuje różne działania
  197.          * @param sender -
  198.          * @param e -
  199.          */
  200.         public void GraphClickHandler(object sender, EventArgs e){
  201.             Console.WriteLine ("GraphClickHandler");
  202.         }
  203.        
  204.         /*
  205.          * @brief Hendler wykonujący się w momencie odrysowywania formatki canvas.
  206.          *
  207.          * @param sender -
  208.          * @param e -
  209.          */
  210.         public void GraphDrawHandler(object sender, EventArgs e){
  211.             Console.WriteLine ("GraphDrawHandler");
  212.             Render();
  213.         }
  214.     }
  215. }
Add Comment
Please, Sign In to add comment