Advertisement
Guest User

Untitled

a guest
Jun 11th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 3.58 KB | None | 0 0
  1. open System
  2. open System.IO
  3.  
  4. let convertDataRow(csvLine:string) =
  5.     let cells = List.ofSeq(csvLine.Split(','))
  6.     match cells with
  7.     | title::number::_ ->
  8.         let parsedNumber = Int32.Parse(number)
  9.         (title, parsedNumber)
  10.     | _ -> failwith "Incorrect data format!"
  11.  
  12. let rec processLines(lines) =
  13.     match lines with
  14.     | [] -> []
  15.     | currentLine::remaining ->
  16.         let parsedLine = convertDataRow(currentLine)
  17.         let parsedRest = processLines(remaining)
  18.         parsedLine :: parsedRest
  19.  
  20. let rec calculateSum(rows) =
  21.     match rows with
  22.     | [] -> 0
  23.     | (_, value)::tail ->
  24.         let remainingSum = calculateSum(tail)
  25.         value + remainingSum
  26.  
  27. let lines = List.ofSeq(File.ReadAllLines(@"E:\dane.csv"))
  28. let data = processLines(lines)
  29.  
  30. open System.Drawing
  31. open System.Windows.Forms
  32. let mainForm = new Form(Width = 620, Height = 450, Text = "Pie Chart")
  33. let menu = new ToolStrip()
  34. let btnOpen = new ToolStripButton("Open")
  35. let btnSave = new ToolStripButton("Save", Enabled = false)
  36. ignore(menu.Items.Add(btnOpen))
  37. ignore(menu.Items.Add(btnSave))
  38. let boxChart = new PictureBox(BackColor = Color.White, Dock =
  39.     DockStyle.Fill, SizeMode = PictureBoxSizeMode.CenterImage)
  40. mainForm.Controls.Add(menu)
  41. mainForm.Controls.Add(boxChart)
  42.  
  43. let rnd = new Random()
  44. let randomBrush() =
  45.     let r, g, b = rnd.Next(256), rnd.Next(256), rnd.Next(256)
  46.     new SolidBrush(Color.FromArgb(r,g,b))
  47.  
  48. let fnt = new Font("Times New Roman", 11.0f)
  49. let centerX, centerY = 300.0, 200.0
  50. let labelDistance = 150.0
  51.  
  52. let drawLabel(gr:Graphics, title, startAngle, angle) =
  53.     let lblAngle = float(startAngle + angle/2)
  54.     let ra = Math.PI * 2.0 * lblAngle / 360.0
  55.     let x = centerX + labelDistance * cos(ra)
  56.     let y = centerY + labelDistance * sin(ra)
  57.     let size = gr.MeasureString(title, fnt)
  58.     let rc = new PointF(float32(x) - size.Width / 2.0f, float32(y) - size.Height / 2.0f)
  59.     gr.DrawString(title, fnt, Brushes.Black, new RectangleF(rc, size))
  60.  
  61. let drawPieSegment(gr:Graphics, title, startAngle, occupiedAngle) =
  62.     let br = randomBrush()
  63.     gr.FillPie(br, 170, 70, 260, 260, startAngle, occupiedAngle)
  64.     br.Dispose()
  65.  
  66. let drawStep(drawingFunc, gr:Graphics, sum, data) =
  67.     let rec drawStepUtil(data, angleSoFar) =
  68.         match data with
  69.         | [] -> ()
  70.         | [title, value] ->
  71.             let angle = 360 - angleSoFar
  72.             drawingFunc(gr, title, angleSoFar, angle)
  73.         | (title, value)::tail ->
  74.             let angle = int(float(value) / sum * 360.0)
  75.             drawingFunc(gr, title, angleSoFar, angle)
  76.             drawStepUtil(tail, angleSoFar + angle)
  77.     drawStepUtil(data, 0)
  78.  
  79. let drawChart(file) =
  80.     let lines = List.ofSeq(File.ReadAllLines(file))
  81.     let data = processLines(lines)
  82.     let sum = float(calculateSum(data))
  83.     let pieChart = new Bitmap(600, 400)
  84.     let gr = Graphics.FromImage(pieChart)
  85.     gr.Clear(Color.White)
  86.     drawStep(drawPieSegment, gr, sum, data)
  87.     drawStep(drawLabel, gr, sum, data)
  88.     gr.Dispose()
  89.     pieChart
  90.  
  91.  
  92. let openAndDrawChart(e) =
  93.     let dlg = new OpenFileDialog(Filter="CSV Files|*.csv")
  94.     if (dlg.ShowDialog() = DialogResult.OK) then
  95.         let pieChart = drawChart(dlg.FileName)
  96.         boxChart.Image <- pieChart
  97.         btnSave.Enabled <- true
  98.    
  99. let saveDrawing(e) =
  100.     let dlg = new SaveFileDialog(Filter="PNG Files|*.png")
  101.     if (dlg.ShowDialog() = DialogResult.OK) then
  102.     boxChart.Image.Save(dlg.FileName)
  103.  
  104. [<STAThread>]
  105. do
  106.     btnOpen.Click.Add(openAndDrawChart)
  107.     btnSave.Click.Add(saveDrawing)
  108.     Application.Run(mainForm)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement