public int timeStart; // Время начала этапа public workSchedule(parties parties, machineTools machineTools, int timeStart) { this.parties = parties; this.machineTools = machineTools; this.timeStart = timeStart; }
private void ShowReport() { logger.Info("Отрисовка графиков!"); Bitmap bmp = new Bitmap(pbReport.Width, pbReport.Height, pbReport.CreateGraphics()); Graphics graphics = Graphics.FromImage(bmp); int iLegendY = 25; // Высота легенды номенклатур int iMarginX = 0; // Отступ слева int iToolNamesX = 60; // Ширина легенды оборудования Font font = new Font("Arial", 8); Pen pen = new Pen(Color.Black, 1); Pen pen2 = new Pen(Color.Black, 2); ArrayList arrClr = new ArrayList(); XDocument xDoc = XDocument.Load(cfg); XElement xCFG = xDoc.Element("cfg"); // Заполняем массив цветов foreach (XElement elm in xCFG.Elements("metalcolors").Nodes <XElement>()) { int id = Int32.Parse(elm.Element("id").Value.ToString()); string metal = elm.Element("metal").Value.ToString(); string color = elm.Element("color").Value.ToString(); ArrayList al = new ArrayList() { metal, color }; arrClr.Insert(id, al); } // Рисуем легенду к графику - номенклатуры for (int i = 0; i < arrNomenclatures.Count; ++i) { ArrayList al = (ArrayList)arrClr[i]; Brush brush = new SolidBrush(ColorTranslator.FromHtml(String.Format("{0}", al[1]))); graphics.FillRectangle(brush, iToolNamesX + iMarginX + i * 60, 0, 60, iLegendY - 5); graphics.DrawString(((nomenclatures)arrNomenclatures[i]).nameNomenclatures, font, Brushes.Black, iToolNamesX + iMarginX + i * 60 + 5, 0 + 5); } int iReportZoneHeigth = pbReport.Height - iLegendY - 20; // Высота зоны всего графика загрузки оборудования int iToolHeight = iReportZoneHeigth / arrTools.Count; // Высота зоны одного экземпляра оборудования // Рассчитываем множитель масштаба по оси Х // Нашли максимальную загрузку, добавили отступ 60, собрали коэффициент как отношение ширины клиентской зоны графика к максимальной загрузке float fMaxLoad = 0; foreach (machineTools mt in arrTools) { if (mt.getCurrentLoad() > fMaxLoad) { fMaxLoad = mt.getCurrentLoad(); } } fMaxLoad += 60; int iReportZoneWidth = pbReport.Width - iMarginX - iToolNamesX; // Ширина зоны графика загрузки оборудования float fScaleCoeff = iReportZoneWidth / fMaxLoad; // Множитель масштаба // Пишем названия машин и рисуем горизонтальные оси for (int i = 0; i < arrTools.Count; ++i) { // Горизонтальная ось graphics.DrawLine(pen, 0, iLegendY + (i + 1) * iToolHeight, pbReport.Width, iLegendY + (i + 1) * iToolHeight); // Название машины graphics.DrawString(((machineTools)arrTools[i]).getName(), new Font("Times New Roman", 10), Brushes.DarkCyan, iMarginX, iLegendY + i * iToolHeight + iToolHeight / 2 - 5); // Рисуем шкалу for (int j = 1; j <= fMaxLoad / 10; ++j) { if (j % 5 == 0) { // Каждая пятая засечка большая и с подписью graphics.DrawLine(pen2, iToolNamesX + j * 10 * fScaleCoeff, iLegendY + (i + 1) * iToolHeight - 5, iToolNamesX + j * 10 * fScaleCoeff, iLegendY + (i + 1) * iToolHeight + 5); graphics.DrawString(String.Format("{0}", j * 10), new Font("Arial Narrow", 8), Brushes.Black, iToolNamesX + j * 10 * fScaleCoeff - 2, iLegendY + (i + 1) * iToolHeight + 5); } else { graphics.DrawLine(pen, iToolNamesX + j * 10 * fScaleCoeff, iLegendY + (i + 1) * iToolHeight - 3, iToolNamesX + j * 10 * fScaleCoeff, iLegendY + (i + 1) * iToolHeight + 3); } } } // Рисуем вертикальную ось (момент времени 0) graphics.DrawLine(pen, iToolNamesX, iLegendY, iToolNamesX, iLegendY + iReportZoneHeigth + 20); int iLoadHeight = iToolHeight / 3; // Высота элемента графика загрузки // Рисуем загрузку машин for (int i = 0; i < arrTools.Count; ++i) { int iCurrLoad = 0; for (int j = 0; j < ((machineTools)arrTools[i]).arrWorks.Count; ++j) { machineTools mt = (machineTools)arrTools[i]; // Цвет выбираем такой же, как был в легенде номенклатур Brush brush = new SolidBrush(ColorTranslator.FromHtml(String.Format("{0}", ((ArrayList)arrClr[((parties)mt.arrWorks[j]).nomenclatures.idNomenclatures])[1]))); // Прямоугольник загрузки graphics.FillRectangle(brush, iToolNamesX + iCurrLoad * fScaleCoeff + 1, iLegendY + (i + 1) * iToolHeight - iLoadHeight - 7, mt.getTimeForProcessingById(((parties)mt.arrWorks[j]).nomenclatures.idNomenclatures) * fScaleCoeff, iLoadHeight ); // Разделительная полосочка graphics.DrawLine(pen, iToolNamesX + (iCurrLoad) * fScaleCoeff, iLegendY + (i + 1) * iToolHeight - iLoadHeight - 7, iToolNamesX + (iCurrLoad) * fScaleCoeff, iLegendY + (i + 1) * iToolHeight - 6 ); // Номер партии graphics.DrawString(String.Format("{0}", ((parties)mt.arrWorks[j]).idParties), font, Brushes.Black, iToolNamesX + iCurrLoad * fScaleCoeff + 2, iLegendY + (i + 1) * iToolHeight - iLoadHeight - 7 + 2 ); iCurrLoad += mt.getTimeForProcessingById(((parties)mt.arrWorks[j]).nomenclatures.idNomenclatures); } } pbReport.Image = bmp; logger.Info("Закончили рисовать!"); }