Beispiel #1
0
        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("Закончили рисовать!");
        }