[8670] | 1 | using System;
|
---|
| 2 | using System.Collections.Generic;
|
---|
| 3 | using System.ComponentModel;
|
---|
| 4 | using System.Drawing;
|
---|
| 5 | using System.Linq;
|
---|
| 6 | using System.Text;
|
---|
| 7 | using System.Windows.Forms;
|
---|
| 8 | using HeuristicLab.Core.Views;
|
---|
| 9 | using HeuristicLab.MainForm;
|
---|
| 10 | using HeuristicLab.PDPSimulation.DomainModel;
|
---|
| 11 | using HeuristicLab.MainForm.WindowsForms;
|
---|
| 12 | using HeuristicLab.Analysis;
|
---|
| 13 |
|
---|
| 14 | namespace HeuristicLab.PDPSimulation.Views {
|
---|
| 15 | [View("VehicleHistoryView")]
|
---|
| 16 | [Content(typeof(VehicleHistoryVisualization), true)]
|
---|
| 17 | public partial class VehicleHistoryView : ItemView {
|
---|
| 18 | public new VehicleHistoryVisualization Content {
|
---|
| 19 | get { return (VehicleHistoryVisualization)base.Content; }
|
---|
| 20 | set { base.Content = value; }
|
---|
| 21 | }
|
---|
| 22 |
|
---|
| 23 | public VehicleHistoryView() {
|
---|
| 24 | InitializeComponent();
|
---|
| 25 | }
|
---|
| 26 |
|
---|
| 27 | protected override void DeregisterContentEvents() {
|
---|
| 28 | Content.ContentChanged -= new EventHandler(Content_ContentChanged);
|
---|
| 29 | base.DeregisterContentEvents();
|
---|
| 30 | }
|
---|
| 31 |
|
---|
| 32 | protected override void RegisterContentEvents() {
|
---|
| 33 | base.RegisterContentEvents();
|
---|
| 34 | Content.ContentChanged += new EventHandler(Content_ContentChanged);
|
---|
| 35 | }
|
---|
| 36 |
|
---|
| 37 | void Content_ContentChanged(object sender, EventArgs e) {
|
---|
| 38 | GenerateImage();
|
---|
| 39 | }
|
---|
| 40 |
|
---|
| 41 | void pictureBox_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e) {
|
---|
| 42 | if (e.Button == System.Windows.Forms.MouseButtons.Right) {
|
---|
| 43 | GenerateImage();
|
---|
| 44 | }
|
---|
| 45 | }
|
---|
| 46 |
|
---|
| 47 | private List<Order> GetServicedOrders(VehicleHistory vehicle) {
|
---|
| 48 | List<Order> result = new List<Order>();
|
---|
| 49 |
|
---|
| 50 | Order current = null;
|
---|
| 51 | for (int i = 0; i < vehicle.VehicleState.Count; i++) {
|
---|
| 52 | current = vehicle.ActiveOrders[i];
|
---|
| 53 | if (vehicle.VehicleState[i] == VehicleState.Servicing && !result.Contains(current))
|
---|
| 54 | result.Add(current);
|
---|
| 55 | }
|
---|
| 56 |
|
---|
| 57 | return result;
|
---|
| 58 | }
|
---|
| 59 |
|
---|
| 60 | private void GenerateImage() {
|
---|
| 61 | if ((pictureBox.Width > 0) && (pictureBox.Height > 0)) {
|
---|
| 62 | VehicleHistoryVisualization content = Content;
|
---|
| 63 |
|
---|
| 64 | if (content == null) {
|
---|
| 65 | pictureBox.Image = null;
|
---|
| 66 | } else {
|
---|
| 67 | Bitmap bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
|
---|
| 68 | using (Graphics graphics = Graphics.FromImage(bitmap)) {
|
---|
| 69 | IEnumerable<VehicleHistory> vehicles = content.VehicleHistory.Where(v => v.VehicleState.Any(s => s != VehicleState.Parked && s != VehicleState.Waiting));
|
---|
| 70 | int vehicleCount = vehicles.Count();
|
---|
| 71 |
|
---|
| 72 | if (vehicleCount > 0) {
|
---|
| 73 | float width = pictureBox.Width - 1;
|
---|
| 74 | float height = pictureBox.Height - 1;
|
---|
| 75 |
|
---|
| 76 | int orderCount = 0;
|
---|
| 77 | foreach (VehicleHistory vehicle in vehicles)
|
---|
| 78 | orderCount += GetServicedOrders(vehicle).Count;
|
---|
| 79 |
|
---|
| 80 | int totalRows = vehicleCount * 3 + orderCount;
|
---|
| 81 | float rowHeight = height / (float)totalRows;
|
---|
| 82 |
|
---|
| 83 | int totalColumns = vehicles.First().VehicleState.Count;
|
---|
| 84 | float columnWidth = width / (float)totalColumns;
|
---|
| 85 | float timeWidth = columnWidth / (float)content.ResultCollectionInterval;
|
---|
| 86 |
|
---|
| 87 | float curY = 0;
|
---|
| 88 | foreach (VehicleHistory vehicle in vehicles) {
|
---|
| 89 | float curX = 0;
|
---|
| 90 |
|
---|
| 91 | int curAvailability = 1;
|
---|
| 92 | VehicleState curState = VehicleState.Parked;
|
---|
| 93 | int counter = 0;
|
---|
| 94 | for (int i = 0; i <= vehicle.VehicleState.Count; i++) {
|
---|
| 95 | counter++;
|
---|
| 96 |
|
---|
| 97 | int availability = 1;
|
---|
| 98 | VehicleState state = VehicleState.Parked;
|
---|
| 99 | if (i < vehicle.VehicleState.Count) {
|
---|
| 100 | state = vehicle.VehicleState[i];
|
---|
| 101 | availability = vehicle.VehicleAvailability[i];
|
---|
| 102 | }
|
---|
| 103 |
|
---|
| 104 | if (state != curState || availability != curAvailability || (i == vehicle.VehicleState.Count && i != 0)) {
|
---|
| 105 | float stateWidth = columnWidth * (float)counter;
|
---|
| 106 |
|
---|
| 107 | Brush brush = Brushes.White;
|
---|
| 108 | if (curAvailability <= 0)
|
---|
| 109 | brush = Brushes.DarkGray;
|
---|
| 110 | if (curState == VehicleState.Moving)
|
---|
| 111 | brush = Brushes.Green;
|
---|
| 112 | else if (curState == VehicleState.Servicing)
|
---|
| 113 | brush = Brushes.Red;
|
---|
| 114 | else if (curState == VehicleState.InvalidAction)
|
---|
| 115 | brush = Brushes.Gray;
|
---|
| 116 |
|
---|
| 117 | graphics.FillRectangle(brush, curX, curY, stateWidth, rowHeight);
|
---|
| 118 |
|
---|
| 119 | curState = state;
|
---|
| 120 | curAvailability = availability;
|
---|
| 121 | counter = 0;
|
---|
| 122 | curX += stateWidth;
|
---|
| 123 | }
|
---|
| 124 | }
|
---|
| 125 |
|
---|
| 126 | graphics.DrawRectangle(Pens.Black, 0, curY, width, rowHeight);
|
---|
| 127 |
|
---|
| 128 | curY += rowHeight;
|
---|
| 129 | curY += rowHeight;
|
---|
| 130 |
|
---|
| 131 | foreach (Order order in GetServicedOrders(vehicle)) {
|
---|
| 132 | float begin = Math.Min(pictureBox.Width, (float)order.PickupReadyTime * timeWidth);
|
---|
| 133 | float end = Math.Min(pictureBox.Width, (float)order.PickupDueTime * timeWidth);
|
---|
| 134 | graphics.DrawLine(Pens.Blue, begin, curY + rowHeight / 2, end, curY + rowHeight / 2);
|
---|
| 135 | graphics.DrawLine(Pens.Blue, begin, curY, begin, curY + rowHeight);
|
---|
| 136 | graphics.DrawLine(Pens.Blue, end, curY, end, curY + rowHeight);
|
---|
| 137 |
|
---|
| 138 | if (order.OrderState != OrderState.Waiting) {
|
---|
| 139 | float pickupTime = Math.Min(width, (float)order.PickupTime * timeWidth);
|
---|
| 140 | graphics.FillEllipse(Brushes.Blue, pickupTime - rowHeight / 4, curY + rowHeight / 4, rowHeight / 2, rowHeight / 2);
|
---|
| 141 | }
|
---|
| 142 |
|
---|
| 143 | if (!order.ServiceRequest) {
|
---|
| 144 | begin = Math.Min(pictureBox.Width, (float)order.DeliveryReadyTime * timeWidth);
|
---|
| 145 | end = Math.Min(pictureBox.Width, (float)order.DeliveryDueTime * timeWidth);
|
---|
| 146 | graphics.DrawLine(Pens.Green, begin, curY + rowHeight / 2, end, curY + rowHeight / 2);
|
---|
| 147 | graphics.DrawLine(Pens.Green, begin, curY, begin, curY + rowHeight);
|
---|
| 148 | graphics.DrawLine(Pens.Green, end, curY, end, curY + rowHeight);
|
---|
| 149 |
|
---|
| 150 | if (order.OrderState != OrderState.Waiting && order.OrderState != OrderState.PickingUp && order.OrderState != OrderState.PickedUp) {
|
---|
| 151 | float deliveryTime = Math.Min(width, (float)order.DeliveryTime * timeWidth);
|
---|
| 152 | graphics.FillEllipse(Brushes.Green, deliveryTime - rowHeight / 4, curY + rowHeight / 4, rowHeight / 2, rowHeight / 2);
|
---|
| 153 | }
|
---|
| 154 | }
|
---|
| 155 |
|
---|
| 156 | curY += rowHeight;
|
---|
| 157 | }
|
---|
| 158 |
|
---|
| 159 | curY += rowHeight;
|
---|
| 160 | }
|
---|
| 161 | }
|
---|
| 162 | pictureBox.Image = bitmap;
|
---|
| 163 | }
|
---|
| 164 | }
|
---|
| 165 | }
|
---|
| 166 | }
|
---|
| 167 |
|
---|
| 168 | protected override void OnContentChanged() {
|
---|
| 169 | base.OnContentChanged();
|
---|
| 170 |
|
---|
| 171 | GenerateImage();
|
---|
| 172 | }
|
---|
| 173 |
|
---|
| 174 | private void VehicleHistoryView_SizeChanged(object sender, EventArgs e) {
|
---|
| 175 | GenerateImage();
|
---|
| 176 | }
|
---|
| 177 | }
|
---|
| 178 | }
|
---|