コード例 #1
0
ファイル: FormLCADowntTime.cs プロジェクト: tianya857727/LCA
        //Make Time Span Chart
        private void BtnDrawStationTimeSpanChart_Click(object sender, EventArgs e)
        {
            #region datasource verify
            LCADownTimeDataDriver dataDriver = LCADownTimeDataDriver.Instance;
            DataTable dt = (DataTable)DGVstationState.DataSource;
            DataTable dtSummary = (DataTable)DGVstationHourly.DataSource;
            if (dt == null || dt.Rows.Count == 0)
            {
                MessageBox.Show("Please Load Data First");
                return;
            }
            #endregion
            #region  start draw setting
            TimeSpanBarChartDraw ChartDraw = TimeSpanBarChartDraw.Instance;
            ChartDraw.ChartAreaStartX = 80;
            ChartDraw.ChartAreaStartY = 80;
            ChartDraw.BarStartX = 100;
            ChartDraw.BarStartX = 100;
            ChartDraw.IniGraphics();
            #endregion
            #region draw Serier Grid&Legend
            int StationIndex = 0;
            double summaryText = 0.00;
            foreach (LCABaseInfo.STATION_NAME station in (LCABaseInfo.STATION_NAME[])Enum.GetValues(typeof(LCABaseInfo.STATION_NAME)))
            {
                SeriesGrid grid = new SeriesGrid(StationIndex, station.ToString());
                ChartDraw.DrawSeriersGrid(grid);
                for (int i = 0; i < dtSummary.Rows.Count; i++)
                {
                    summaryText += Convert.ToDouble(dtSummary.Rows[i][StationIndex + 1].ToString());
                }

                summaryText = Math.Round(summaryText / (double)60, 2);
                ChartDraw.DrawSummaryLabel(grid, summaryText.ToString() + "m");
                StationIndex++;
                summaryText = 0.00;
            }
            SeriesLegend[] SeriesLegends = new SeriesLegend[LCADrawInfo.MachineState_Colors().Count];
            int SereiesIndex = 0;
            foreach (KeyValuePair<int, Color> machineStateColor in LCADrawInfo.MachineState_Colors())
            {
                SeriesLegends[SereiesIndex] = new SeriesLegend(SereiesIndex, machineStateColor.Key.ToString(), machineStateColor.Value);
                SereiesIndex++;
            }
            ChartDraw.DrawSeriesLengends(SeriesLegends);
            #endregion
            #region draw TimeSpan bar
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DataRow dr = dt.Rows[i];
                LCAMachineState2 lcaDownTime = new LCAMachineState2();
                lcaDownTime.START_TIME = (DateTime)dr[LCAMachineState2.HEADERCHAR.START_TIME.ToString()];
                lcaDownTime.STOP_TIME = (DateTime)dr[LCAMachineState2.HEADERCHAR.STOP_TIME.ToString()];
                lcaDownTime.TIME_OF_STATE = System.Convert.ToInt32(dr[LCAMachineState2.HEADERCHAR.TIME_OF_STATE.ToString()]);
                lcaDownTime.CURRENTSTATE = System.Convert.ToInt32(dr[LCAMachineState2.HEADERCHAR.CURRENTSTATE.ToString()]);
                lcaDownTime.STATION_NAME = dr[LCAMachineState2.HEADERCHAR.STATION_NAME.ToString()].ToString();
                Boolean IsStateSelect = false;
                Boolean IsStationSelect = false;
                foreach (String state in LbxState.SelectedItems)
                {
                    if (lcaDownTime.CURRENTSTATE == (int)Enum.Parse(typeof(LCABaseInfo.OEE_STATE), state))
                    {
                        IsStateSelect = true;
                        break;
                    }
                }
                if (!IsStateSelect) continue;
                foreach (String station in LbxStation.SelectedItems)
                {
                    if (lcaDownTime.STATION_NAME == station)
                    {
                        IsStationSelect = true;
                        break;
                    }
                }
                if (!IsStationSelect) continue;
                StationIndex = 0;
                float barStartX = (float)(lcaDownTime.START_TIME.Ticks - minDateTime.Ticks) / TimeSpan.TicksPerSecond / (totalHourSpan + 1) / 3600 * ChartDraw.ChartWitdh;
                float barWidth = (float)lcaDownTime.TIME_OF_STATE / (totalHourSpan + 1) / 3600 * ChartDraw.ChartWitdh;
                foreach (LCABaseInfo.STATION_NAME station in (LCABaseInfo.STATION_NAME[])Enum.GetValues(typeof(LCABaseInfo.STATION_NAME)))
                {
                    if (lcaDownTime.STATION_NAME == station.ToString()) { break; }
                    StationIndex++;
                }
                TimeSpanBar bar = new TimeSpanBar(StationIndex, barStartX, barWidth);
                bar.BarColor = LCADrawInfo.MachineState_Colors()[(int)lcaDownTime.CURRENTSTATE];
                ChartDraw.DrawBar(bar);
            }
            #endregion
            #region draw TimeSpan Grid
            for (int i = 0; i < totalHourSpan + 2; i++)
            {
                String LabelText = (minDateTime.AddHours(i).Hour).ToString();
                TimeSpanGrid gird = new TimeSpanGrid(LabelText, (float)ChartDraw.ChartWitdh / (totalHourSpan + 1) * i, 0, 500);
                ChartDraw.DrawTimeSpanGrid(gird);
            }
            #endregion
            //ChartDraw.ImgFilePath = @"E:\LCA Data\test.jpg";
            String ImgFileName = "MachineDT" + startDateTime.ToString("yyyMMddHH") + " - " + endDateTime.ToString("yyyyMMddHH");
            ChartDraw.saveImg(ImgFileName);
            ChartForm newForm = new ChartForm();
            newForm.Text = ChartDraw.ImgFileName;
            newForm.Height = ChartDraw.ChartHeight;
            newForm.Width = ChartDraw.ChartWitdh;
            newForm.BackgroundImage = ChartDraw.ChartImg;
            newForm.BackgroundImageLayout = ImageLayout.Stretch;
            newForm.Show();
        }
コード例 #2
0
ファイル: FormLCADowntTime.cs プロジェクト: tianya857727/LCA
        //Generate Line Downtime  Time Span Chart
        public void BtnDrawLineTimeSpanChart_Click(object sender, EventArgs e)
        {
            #region  validate table
            LCADownTimeDataDriver dataDriver = LCADownTimeDataDriver.Instance;
            if (!dataDriver.LCADataSet.Tables.Contains("LCALineDownTime") || dataDriver.LCADataSet.Tables["LCALineDownTime"].Rows.Count < 1)
            {
                MessageBox.Show("Please load Souce Data Firstly");
                return;
            }
            dataDriver.WriteTableToList("LCALineDownTime", typeof(LCALineState).FullName);
            List<object> dataList = dataDriver.LCADataList;
            if (dataList == null || dataList.Count == 0)
            {
                MessageBox.Show("Please Load Data and LCA line State Report First");
                return;
            }
            #endregion
            #region  initial Draw Chart setting
            TimeSpanBarChartDraw ChartDraw = TimeSpanBarChartDraw.Instance;
            ChartDraw.IniGraphics();
            ChartDraw.ChartAreaStartX = 80;
            ChartDraw.ChartAreaStartY = 80;
            ChartDraw.BarStartX = 100;
            ChartDraw.BarStartX = 100;
            #endregion
            #region Draw Series Legends
            SeriesLegend[] SeriesLegends = new SeriesLegend[LCADrawInfo.LineState_Colors().Count];
            int SereiesIndex = 0;
            foreach (KeyValuePair<String, Color> lineStateColor in LCADrawInfo.LineState_Colors())
            {
                SeriesLegends[SereiesIndex] = new SeriesLegend(SereiesIndex, lineStateColor.Key.ToString(), lineStateColor.Value);
                SereiesIndex++;
            }
            ChartDraw.DrawSeriesLengends(SeriesLegends);
            #endregion
            DataTable dtNew = new DataTable("LCALineHourlyDownTime");
            LCADownTimeRule rule = LCADownTimeRule.Instance;
            #region station column&hour row add
            dtNew.Columns.Add(LCAMachineStateToPeriod.HEADERCHAR.Period.ToString());
            foreach (LCABaseInfo.LINE_STATE lineState in (LCABaseInfo.LINE_STATE[])Enum.GetValues(typeof(LCABaseInfo.LINE_STATE)))
            {
                dtNew.Columns.Add(lineState.ToString());
            }
            for (int i = 0; i < totalHourSpan + 1; i++)
            {
                DataRow newRow = dtNew.NewRow();
                newRow[LCAMachineStateToPeriod.HEADERCHAR.Period.ToString()] = minDateTime.AddHours(i).ToString("yyyy-MM-dd-HH");
                foreach (LCABaseInfo.LINE_STATE lineState in (LCABaseInfo.LINE_STATE[])Enum.GetValues(typeof(LCABaseInfo.LINE_STATE)))
                {
                    newRow[lineState.ToString()] = 0;
                }
                dtNew.Rows.Add(newRow);
            }
            #endregion
            for (int i = 0; i < dataDriver.LCADataList.Count; i++)
            {
                LCALineState lineDowntime = (LCALineState)dataList[i];
                #region  Draw Time Span Bar
                float barStartX = (float)(lineDowntime.START_TIME.Ticks - minDateTime.Ticks) / TimeSpan.TicksPerSecond / (totalHourSpan + 1) / 3600 * ChartDraw.ChartWitdh;
                float barWidth = (float)lineDowntime.TIME_OF_STATE / (totalHourSpan + 1) / 3600 * ChartDraw.ChartWitdh;
                TimeSpanBar bar = new TimeSpanBar(0, barStartX, barWidth);
                bar.BarColor = LCADrawInfo.LineState_Colors()["Pause"];
                if (rule.IsLineDownTime(lineDowntime))
                {
                    bar.BarColor = LCADrawInfo.LineState_Colors()["Stop"];
                }
                if (rule.IsLineUpTime(lineDowntime))
                {
                    bar.BarColor = LCADrawInfo.LineState_Colors()["Run"];
                }
                ChartDraw.DrawBar(bar);
                #endregion

                LCAMachineStateToPeriod stateToHour = new LCAMachineStateToPeriod();
                lineDowntime.LCA_LINE = "LCA_CELL_2";
                #region  hourly downtime calculation
                int HourIndex = Convert.ToInt32((lineDowntime.START_TIME.Ticks - minDateTime.Ticks) / TimeSpan.TicksPerHour);
                String lineState = LCABaseInfo.LINE_STATE.Pause.ToString();
                if (rule.IsLineUpTime(lineDowntime))
                {
                    lineState = LCABaseInfo.LINE_STATE.Run.ToString();
                }
                if (rule.IsLineDownTime(lineDowntime))
                {
                    lineState = LCABaseInfo.LINE_STATE.Stop.ToString();
                }
                int hourlydowntime = System.Convert.ToInt32(dtNew.Rows[HourIndex][lineState].ToString());
                int stateTime = (int)lineDowntime.TIME_OF_STATE;
                if (lineDowntime.START_TIME.Second + lineDowntime.START_TIME.Minute * 60 + stateTime > 3600)
                {
                    dtNew.Rows[HourIndex][lineState] = hourlydowntime + 3600 - lineDowntime.START_TIME.Second - lineDowntime.START_TIME.Minute * 60;
                    int j = 1;
                    for (j = 0; j < (stateTime + lineDowntime.START_TIME.Second + lineDowntime.START_TIME.Minute * 60) / 3600 - 1; j++)
                    {
                        if (HourIndex + j + 1 > totalHourSpan - 1)
                        {
                            break;
                        }
                        dtNew.Rows[HourIndex + j + 1][lineState] = System.Convert.ToInt32(dtNew.Rows[HourIndex + j + 1][lineState].ToString()) + 3600;
                    }
                    if (HourIndex + j + 1 > totalHourSpan - 1)
                    {
                        continue;
                    }
                    dtNew.Rows[HourIndex + j + 1][lineState] = System.Convert.ToInt32(dtNew.Rows[HourIndex + j + 1][lineState].ToString()) + (lineDowntime.START_TIME.Second + lineDowntime.START_TIME.Minute * 60 + stateTime) % 3600;
                }
                else
                {
                    dtNew.Rows[HourIndex][lineState] = hourlydowntime + stateTime;
                }
                #endregion
            }
            #region Get Hourly Output Data

            string strSQL = String.Format(@"select  to_char(lca.birth_date,'yyyy-MM-dd-hh24') as hourly,count(*) as output 
from lca.lca_data2 lca
                    where  lca.birth_date between to_date('{0}','dd-MM-yyyy HH24:mi:ss') and
                    to_date('{1}','dd-MM-yyyy HH24:mi:ss')   and lca_line='{2}' 
                   group by to_char(lca.birth_date,'yyyy-MM-dd-hh24') order by 1", startDateTime.ToString("dd-MM-yyyy HH:mm:ss"), endDateTime.ToString("dd-MM-yyyy HH:mm:ss"),strCellNo);
            dataDriver.CrunchTable(strSQL, "OutputSourceData");
            DataTable dtOutput = dataDriver.LCADataSet.Tables["OutputSourceData"];

            if (dtOutput.Rows.Count == 0)
            {
                MessageBox.Show("No Output!");
                return;
            }

            dtNew.Columns.Add("Output");
            for (int i = 0, j = 0; i < dtNew.Rows.Count; i++)
            {
                if (i >= dtNew.Rows.Count || j >= dtOutput.Rows.Count)
                {
                    break;
                }
                else
                {
                    if (dtNew.Rows[i][0].ToString() == dtOutput.Rows[j][0].ToString())
                    {
                        dtNew.Rows[i]["Output"] = dtOutput.Rows[j][1];
                        j++;
                    }
                    else
                    {
                        dtNew.Rows[i]["Output"] = 0;
                    }
                }
            }
            //DataTable dtCombine = dataDriver.CombineDataTable(dtNew, dataDriver.LCADataSet.Tables["OutputSourceData"], "HourlyOutput");
            #endregion

            #region Draw TimeSpan  Grid
            SeriesGrid lineGrid = new SeriesGrid(0, "LCA_CELL_2");
            ChartDraw.DrawSeriersGrid(lineGrid);
            for (int i = 0; i < totalHourSpan + 2; i++)
            {
                String LabelText = (minDateTime.AddHours(i).Hour).ToString();
                TimeSpanGrid gird = new TimeSpanGrid(LabelText, (float)ChartDraw.ChartWitdh / (totalHourSpan + 1) * i, 0, 500);
                ChartDraw.DrawTimeSpanGrid(gird);
            }
            #endregion

            #region Draw Interval Chart

            //Get Interval Data
            TimeIntervalChartDraw graph = TimeIntervalChartDraw.Instance;
            #region Draw Chart Area
            IntervalChartArea chartArea = new IntervalChartArea(100, 150, 800, 430);
            graph.colorSplit = 8;
            graph.IniGraphics(ChartDraw.ChartImg);
            graph.AddChartArea(chartArea);
            #endregion
            #region Get Time Span
            DataTable dtSQL = new DataTable("SQLTabel");
            DataTable dtInterval = new DataTable("IntervalTabel");
            dtInterval.Columns.Add("Time", typeof(int));
            dtInterval.Columns.Add("Interval", typeof(int));

            DataTable dtIntervalGrid = new DataTable("GridData");
            dtIntervalGrid.Columns.Add("Time", typeof(DateTime));
            dtIntervalGrid.Columns.Add("Interval", typeof(int));

            #endregion
            #region Draw Grid
            Int32 yMid = Convert.ToInt32(textMid.Text);
            Int32 yMax = Convert.ToInt32(textMax.Text);
            //span = Convert.ToDateTime(strEnd) - Convert.ToDateTime(strFrom);
            LegendGrid grid = new LegendGrid((int)totalHourSpan + 1, yMid);
            graph.AddAxis(grid);
            #endregion
            strSQL = String.Format(@"select birth_date from lca.lca_data2 
                    where  birth_date between to_date('{0}','dd-MM-yyyy HH24:mi:ss') and    to_date('{1}','dd-MM-yyyy HH24:mi:ss')  and lca_line='{2}' 
                  order by 1", startDateTime.ToString("dd-MM-yyyy HH:mm:ss"), endDateTime.ToString("dd-MM-yyyy HH:mm:ss"),strCellNo);
            dataDriver.CrunchTable(strSQL, "BirthDataSort");
            dtSQL = dataDriver.LCADataSet.Tables["BirthDataSort"];
            if (dtSQL.Rows.Count == 0)
            {
                return;
            }
            int intRed = 0;
            int intGreen = 0;
            int intYellow = 0;
            #region Draw First Point
            IntervalBar barPoint = new IntervalBar();
            DataRow newIntervalRow = dtInterval.NewRow();
            TimeSpan span;
            span = (DateTime)dtSQL.Rows[0][0] - startDateTime;
            newIntervalRow[0] = span.TotalSeconds;
            newIntervalRow[1] = span.TotalSeconds;

            if (Convert.ToInt32(newIntervalRow[1]) >= yMid && Convert.ToInt32(newIntervalRow[1]) < yMax)
            {
                barPoint.BarHeight = yMid;
                barPoint.BarColor = Color.Yellow;
                intYellow++;
            }
            else if (Convert.ToInt32(newIntervalRow[1]) >= yMax)
            {
                barPoint.BarHeight = yMid;
                barPoint.BarColor = Color.Orchid;
                intRed++;
            }
            else
            {
                barPoint.BarHeight = Convert.ToInt32(newIntervalRow[1]);
                barPoint.BarColor = Color.LightSkyBlue;
                intGreen++;
            }
            barPoint.XStart = 0;
            barPoint.YStart = barPoint.BarHeight;
            barPoint.BarWidth = Convert.ToInt32(newIntervalRow[1]);

            graph.DrawBarPoint(barPoint);
            dtInterval.Rows.Add(newIntervalRow);

            DataRow dtGrid = dtIntervalGrid.NewRow();
            if (Convert.ToInt32(newIntervalRow[1]) >= yMax)
            {
                dtGrid[0] = startDateTime.AddSeconds(Convert.ToInt32(newIntervalRow[0]));
                dtGrid[1] = newIntervalRow[1];
                dtIntervalGrid.Rows.Add(dtGrid);
            }
            #endregion
            #region Draw Other Points
            for (int i = 1; i < dtSQL.Rows.Count; i++)
            {

                newIntervalRow = dtInterval.NewRow();
                span = ((DateTime)dtSQL.Rows[i][0]) - startDateTime;
                newIntervalRow[0] = span.TotalSeconds;
                newIntervalRow[1] = (((DateTime)dtSQL.Rows[i][0]).Ticks - ((DateTime)dtSQL.Rows[i - 1][0]).Ticks) / TimeSpan.TicksPerSecond;
                if (Convert.ToInt32(newIntervalRow[1]) >= yMid && Convert.ToInt32(newIntervalRow[1]) < yMax)
                {
                    barPoint.BarHeight = yMid;
                    barPoint.BarColor = Color.Yellow;
                    intYellow++;
                }
                else if (Convert.ToInt32(newIntervalRow[1]) >= yMax)
                {
                    barPoint.BarHeight = yMid;
                    barPoint.BarColor = Color.Orchid;
                    intRed++;

                    dtGrid = dtIntervalGrid.NewRow();
                    dtGrid[0] = Convert.ToDateTime(startDateTime).AddSeconds(Convert.ToInt32(newIntervalRow[0]));
                    dtGrid[1] = newIntervalRow[1];
                    dtIntervalGrid.Rows.Add(dtGrid);
                }
                else
                {
                    barPoint.BarHeight = Convert.ToInt32(newIntervalRow[1]);
                    barPoint.BarColor = Color.LightSkyBlue;
                    intGreen++;
                }

                barPoint.YStart = barPoint.BarHeight;
                barPoint.BarWidth = Convert.ToInt32(newIntervalRow[1]);
                barPoint.XStart = Convert.ToInt32(newIntervalRow[0]) - Convert.ToInt32(newIntervalRow[1]);

                graph.DrawBarPoint(barPoint);
                dtInterval.Rows.Add(newIntervalRow);


            }
            #endregion

            //graph.AddSeries(dtInterval);
            dtInvervalAbnormal.DataSource = dtIntervalGrid;
            graph.AddCountLabel(intRed, intGreen, intYellow);
            graph.DrawStartLabel(dtSQL.Rows[0][0].ToString());
            graph.DrawEndLabel(dtSQL.Rows[dtSQL.Rows.Count - 1][0].ToString());
            #endregion

            String fileName = "LineDT" + startDateTime.ToString("yyyyMMddHH") + " - " + endDateTime.ToString("yyyyMMddHH");
            DGVlineHourly.DataSource = dtNew;
            buManualImport.Enabled = true;
            dataDriver.WriteDataToFile(dtNew, fileName);
            tabControl1.SelectedTab = TPLineHourly;
            //ChartDraw.saveImg(fileName);
            //ChartForm newForm = new ChartForm();
            //newForm.Text = ChartDraw.ImgFileName;
            //newForm.Height = ChartDraw.ChartHeight;
            //newForm.Width = ChartDraw.ChartWitdh;
            //newForm.BackgroundImage = ChartDraw.ChartImg;
            //newForm.BackgroundImageLayout = ImageLayout.Stretch;

            graph.saveImg(fileName);
            ChartForm newForm = new ChartForm();
            newForm.Text = graph.ImgFileName;
            newForm.Height = ChartDraw.ChartHeight;
            newForm.Width = ChartDraw.ChartWitdh;
            newForm.BackgroundImage = graph.ChartImg;
            newForm.BackgroundImageLayout = ImageLayout.Stretch;
            newForm.Show();
            graph.ChartImg = newForm.BackgroundImage;

        }
コード例 #3
0
ファイル: FormLCADowntTime.cs プロジェクト: tianya857727/LCA
        //Button Line Hourly Report Chart
        public DataTable GetHourData()
        {
            #region 注释
            /*
            #region  validate table
            LCADownTimeDataDriver dataDriver = LCADownTimeDataDriver.Instance;
            if (!dataDriver.LCADataSet.Tables.Contains("LCALineDownTime") || dataDriver.LCADataSet.Tables["LCALineDownTime"].Rows.Count < 1)
            {
                MessageBox.Show("Please load Souce Data Firstly");
                return;
            }
            dataDriver.WriteTableToList("LCALineDownTime", typeof(LCALineState).FullName);
            List<object> dataList = dataDriver.LCADataList;
            if (dataList == null || dataList.Count == 0)
            {
                MessageBox.Show("Please Load Data and LCA line State Report First");
                return;
            }
            #endregion
            DataTable dtNew = new DataTable("LCALineHourlyDownTime");
            LCADownTimeRule rule = LCADownTimeRule.Instance;
            #region station column&hour row add
            dtNew.Columns.Add(LCAMachineStateToPeriod.HEADERCHAR.Period.ToString());
            foreach (LCABaseInfo.LINE_STATE lineState in (LCABaseInfo.LINE_STATE[])Enum.GetValues(typeof(LCABaseInfo.LINE_STATE)))
            {
                dtNew.Columns.Add(lineState.ToString());
            }

            for (int i = 0; i < totalHourSpan; i++)
            {
                DataRow newRow = dtNew.NewRow();
                newRow[LCAMachineStateToPeriod.HEADERCHAR.Period.ToString()] = minDateTime.AddHours(i).ToString("yyyy-MM-dd-HH");
                foreach (LCABaseInfo.LINE_STATE lineState in (LCABaseInfo.LINE_STATE[])Enum.GetValues(typeof(LCABaseInfo.LINE_STATE)))
                {
                    newRow[lineState.ToString()] = 0;
                }
                dtNew.Rows.Add(newRow);
            }
            #endregion
            for (int i = 0; i < dataDriver.LCADataList.Count; i++)
            {
                LCALineState lineDowntime = (LCALineState)dataList[i];

                LCAMachineStateToPeriod stateToHour = new LCAMachineStateToPeriod();
                lineDowntime.LCA_LINE = "LCA_CELL_2";
                #region  hourly downtime calculation
                int HourIndex = Convert.ToInt32((lineDowntime.START_TIME.Ticks - minDateTime.Ticks) / TimeSpan.TicksPerHour);
                String lineState = LCABaseInfo.LINE_STATE.Pause.ToString();
                if (rule.IsLineUpTime(lineDowntime))
                {
                    lineState = LCABaseInfo.LINE_STATE.Run.ToString();
                }
                if (rule.IsLineDownTime(lineDowntime))
                {
                    lineState = LCABaseInfo.LINE_STATE.Stop.ToString();
                }
                int hourlydowntime = System.Convert.ToInt32(dtNew.Rows[HourIndex][lineState].ToString());
                int stateTime = (int)lineDowntime.TIME_OF_STATE;
                if (lineDowntime.START_TIME.Second + lineDowntime.START_TIME.Minute * 60 + stateTime > 3600)
                {
                    dtNew.Rows[HourIndex][lineState] = hourlydowntime + 3600 - lineDowntime.START_TIME.Second - lineDowntime.START_TIME.Minute * 60;
                    int j = 1;
                    for (j = 0; j < (stateTime + lineDowntime.START_TIME.Second + lineDowntime.START_TIME.Minute * 60) / 3600 - 1; j++)
                    {
                        if (HourIndex + j + 1 > totalHourSpan - 1)
                        {
                            break;
                        }
                        dtNew.Rows[HourIndex + j + 1][lineState] = System.Convert.ToInt32(dtNew.Rows[HourIndex + j + 1][lineState].ToString()) + 3600;
                    }
                    if (HourIndex + j + 1 > totalHourSpan - 1)
                    {
                        continue;
                    }
                    dtNew.Rows[HourIndex + j + 1][lineState] = System.Convert.ToInt32(dtNew.Rows[HourIndex + j + 1][lineState].ToString()) + (lineDowntime.START_TIME.Second + lineDowntime.START_TIME.Minute * 60 + stateTime) % 3600;
                }
                else
                {
                    dtNew.Rows[HourIndex][lineState] = hourlydowntime + stateTime;
                }
                #endregion
            }
            #region Get Hourly Output Data
            string strFrom, strEnd;
            OleDbUtility oleUtility = new OleDbUtility("ods", "users", "users");
            oleUtility.getConnection();
            oleUtility.OpenConnection();

            strFrom = dateTimePicker1.Value.AddDays(-1).ToString("yyyy-MM-dd") + " 07:00";
            strEnd = dateTimePicker1.Value.ToString("yyyy-MM-dd") + " 07:00";
            string strSQL = "select to_char(lca.birth_date,'yyyy-MM-dd-hh24') as hourly,count(*) as output from lca.lca_data2 lca where to_char(lca.birth_date,'yyyy-MM-dd hh24:mi') between '" + strFrom +"' and '"+ strEnd + "'  group by to_char(lca.birth_date,'yyyy-MM-dd-hh24') order by to_char(lca.birth_date,'yyyy-MM-dd-hh24')" ;

            DataTable dtOutput = new DataTable("OutputSourceData");
            dtOutput = oleUtility.SQLQuery_DataTable(strSQL);

            dtNew.Columns.Add("Output");
            for (int i = 0,j=0; i < dtNew.Rows.Count; i++)
            {
                if (i >= dtNew.Rows.Count || j >= dtOutput.Rows.Count)
                {
                    break;
                }
                else
                {
                    if (dtNew.Rows[i][0].ToString() == dtOutput.Rows[j][0].ToString())
                    {
                        dtNew.Rows[i]["Output"] = dtOutput.Rows[j][1];
                        j++;
                    }
                    else
                    {
                        dtNew.Rows[i]["Output"] = 0;
                    }
                }
            }
            //DataTable dtCombine = dataDriver.CombineDataTable(dtNew, dataDriver.LCADataSet.Tables["OutputSourceData"], "HourlyOutput");
            
            DGVlineHourly.DataSource = dtNew;
            */
            #endregion
            #region  validate table
            LCADownTimeDataDriver dataDriver = LCADownTimeDataDriver.Instance;
            if (!dataDriver.LCADataSet.Tables.Contains("LCALineDownTime") || dataDriver.LCADataSet.Tables["LCALineDownTime"].Rows.Count < 1)
            {
                MessageBox.Show("Please load Souce Data Firstly");
                return null;
            }
            dataDriver.WriteTableToList("LCALineDownTime", typeof(LCALineState).FullName);
            List<object> dataList = dataDriver.LCADataList;
            if (dataList == null || dataList.Count == 0)
            {
                MessageBox.Show("Please Load Data and LCA line State Report First");
                return null;
            }
            #endregion
            #region  initial Draw Chart setting
            TimeSpanBarChartDraw ChartDraw = TimeSpanBarChartDraw.Instance;
            ChartDraw.IniGraphics();
            ChartDraw.ChartAreaStartX = 80;
            ChartDraw.ChartAreaStartY = 80;
            ChartDraw.BarStartX = 100;
            ChartDraw.BarStartX = 100;
            #endregion
            #region Draw Series Legends
            SeriesLegend[] SeriesLegends = new SeriesLegend[LCADrawInfo.LineState_Colors().Count];
            int SereiesIndex = 0;
            foreach (KeyValuePair<String, Color> lineStateColor in LCADrawInfo.LineState_Colors())
            {
                SeriesLegends[SereiesIndex] = new SeriesLegend(SereiesIndex, lineStateColor.Key.ToString(), lineStateColor.Value);
                SereiesIndex++;
            }
            ChartDraw.DrawSeriesLengends(SeriesLegends);
            #endregion
            DataTable dtNew = new DataTable("LCALineHourlyDownTime");
            LCADownTimeRule rule = LCADownTimeRule.Instance;
            #region station column&hour row add
            dtNew.Columns.Add(LCAMachineStateToPeriod.HEADERCHAR.Period.ToString());
            foreach (LCABaseInfo.LINE_STATE lineState in (LCABaseInfo.LINE_STATE[])Enum.GetValues(typeof(LCABaseInfo.LINE_STATE)))
            {
                dtNew.Columns.Add(lineState.ToString());
            }
            for (int i = 0; i < totalHourSpan + 1; i++)
            {
                DataRow newRow = dtNew.NewRow();
                newRow[LCAMachineStateToPeriod.HEADERCHAR.Period.ToString()] = minDateTime.AddHours(i).ToString("yyyy-MM-dd-HH");
                foreach (LCABaseInfo.LINE_STATE lineState in (LCABaseInfo.LINE_STATE[])Enum.GetValues(typeof(LCABaseInfo.LINE_STATE)))
                {
                    newRow[lineState.ToString()] = 0;
                }
                dtNew.Rows.Add(newRow);
            }
            #endregion
            for (int i = 0; i < dataDriver.LCADataList.Count; i++)
            {
                LCALineState lineDowntime = (LCALineState)dataList[i];
                #region  Draw Time Span Bar
                float barStartX = (float)(lineDowntime.START_TIME.Ticks - minDateTime.Ticks) / TimeSpan.TicksPerSecond / totalSecondSpan * ChartDraw.ChartWitdh;
                float barWidth = (float)lineDowntime.TIME_OF_STATE / totalSecondSpan * ChartDraw.ChartWitdh;
                TimeSpanBar bar = new TimeSpanBar(0, barStartX, barWidth);
                bar.BarColor = LCADrawInfo.LineState_Colors()["Pause"];
                if (rule.IsLineDownTime(lineDowntime))
                {
                    bar.BarColor = LCADrawInfo.LineState_Colors()["Stop"];
                }
                if (rule.IsLineUpTime(lineDowntime))
                {
                    bar.BarColor = LCADrawInfo.LineState_Colors()["Run"];
                }
                ChartDraw.DrawBar(bar);
                #endregion

                LCAMachineStateToPeriod stateToHour = new LCAMachineStateToPeriod();
                lineDowntime.LCA_LINE = "LCA_CELL_2";
                #region  hourly downtime calculation
                int HourIndex = Convert.ToInt32((lineDowntime.START_TIME.Ticks - minDateTime.Ticks) / TimeSpan.TicksPerHour);
                String lineState = LCABaseInfo.LINE_STATE.Pause.ToString();
                if (rule.IsLineUpTime(lineDowntime))
                {
                    lineState = LCABaseInfo.LINE_STATE.Run.ToString();
                }
                if (rule.IsLineDownTime(lineDowntime))
                {
                    lineState = LCABaseInfo.LINE_STATE.Stop.ToString();
                }
                int hourlydowntime = System.Convert.ToInt32(dtNew.Rows[HourIndex][lineState].ToString());
                int stateTime = (int)lineDowntime.TIME_OF_STATE;
                if (lineDowntime.START_TIME.Second + lineDowntime.START_TIME.Minute * 60 + stateTime > 3600)
                {
                    dtNew.Rows[HourIndex][lineState] = hourlydowntime + 3600 - lineDowntime.START_TIME.Second - lineDowntime.START_TIME.Minute * 60;
                    int j = 1;
                    for (j = 0; j < (stateTime + lineDowntime.START_TIME.Second + lineDowntime.START_TIME.Minute * 60) / 3600 - 1; j++)
                    {
                        if (HourIndex + j + 1 > totalHourSpan - 1)
                        {
                            break;
                        }
                        dtNew.Rows[HourIndex + j + 1][lineState] = System.Convert.ToInt32(dtNew.Rows[HourIndex + j + 1][lineState].ToString()) + 3600;
                    }
                    if (HourIndex + j + 1 > totalHourSpan - 1)
                    {
                        continue;
                    }
                    dtNew.Rows[HourIndex + j + 1][lineState] = System.Convert.ToInt32(dtNew.Rows[HourIndex + j + 1][lineState].ToString()) + (lineDowntime.START_TIME.Second + lineDowntime.START_TIME.Minute * 60 + stateTime) % 3600;
                }
                else
                {
                    dtNew.Rows[HourIndex][lineState] = hourlydowntime + stateTime;
                }
                #endregion
            }
            #region Get Hourly Output Data
            string strFrom, strEnd;
            OleDbUtility oleUtility = new OleDbUtility("ods", "users", "users");
            oleUtility.getConnection();
            oleUtility.OpenConnection();


            strFrom = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + " 07:00";
            strEnd = DateTime.Now.ToString("yyyy-MM-dd") + " 07:00";

            switch (LbxShift.SelectedItem.ToString())
            {
                case "Day":
                    strFrom = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + " 07:00";
                    strEnd = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + " 19:00"; break;
                case "Night":
                    strFrom = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + " 19:00";
                    strEnd = DateTime.Now.ToString("yyyy-MM-dd") + " 07:00"; break;
                default:
                    strFrom = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + " 07:00";
                    strEnd = DateTime.Now.ToString("yyyy-MM-dd") + " 07:00"; break;
            }

            string strSQL = "select to_char(lca.birth_date,'yyyy-MM-dd-hh24') as hourly,count(*) as output from lca.lca_data2 lca where to_char(lca.birth_date,'yyyy-MM-dd hh24:mi') between '" + strFrom + "' and '" + strEnd + "'  and lca_line='"+ strCellNo + "'  group by to_char(lca.birth_date,'yyyy-MM-dd-hh24') order by to_char(lca.birth_date,'yyyy-MM-dd-hh24')";

            DataTable dtOutput = new DataTable("OutputSourceData");
            dtOutput = oleUtility.SQLQuery_DataTable(strSQL);

            dtNew.Columns.Add("Output");
            for (int i = 0, j = 0; i < dtNew.Rows.Count; i++)
            {
                if (i >= dtNew.Rows.Count || j >= dtOutput.Rows.Count)
                {
                    break;
                }
                else
                {
                    if (dtNew.Rows[i][0].ToString() == dtOutput.Rows[j][0].ToString())
                    {
                        dtNew.Rows[i]["Output"] = dtOutput.Rows[j][1];
                        j++;
                    }
                    else
                    {
                        dtNew.Rows[i]["Output"] = 0;
                    }
                }
            }

            dtOutput.Clear();
            for (int i = 0; i < dtNew.Rows.Count; i++)
            {
                DataRow dtRowOutput = dtOutput.NewRow();
                dtRowOutput[0] = dtNew.Rows[i]["Output"];
                dtOutput.Rows.Add(dtRowOutput);
            }

            //DataTable dtCombine = dataDriver.CombineDataTable(dtNew, dataDriver.LCADataSet.Tables["OutputSourceData"], "HourlyOutput");
            #endregion
            SeriesGrid lineGrid = new SeriesGrid(0, "LCA_CELL_2");
            ChartDraw.DrawSeriersGrid(lineGrid);
            #region Draw TimeSpan  Grid
            for (int i = 0; i < totalHourSpan + 2; i++)
            {
                String LabelText = (minDateTime.AddHours(i).Hour).ToString();
                TimeSpanGrid gird = new TimeSpanGrid(LabelText, (float)3600 / totalSecondSpan * ChartDraw.ChartWitdh * i, 0, 500);
                ChartDraw.DrawTimeSpanGrid(gird);
            }
            #endregion
            #region Draw Interval Chart

            switch (LbxShift.SelectedItem.ToString())
            {
                case "All Shift": strFrom = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + " 07:00:00"; strEnd = DateTime.Now.ToString("yyyy-MM-dd") + " 07:00:00"; break;
                case "Day": strFrom = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + " 07:00:00"; strEnd = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + " 19:00:00"; break;
                case "Night": strFrom = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + " 19:00:00"; strEnd = DateTime.Now.ToString("yyyy-MM-dd") + " 07:00:00"; break;
            }
            TimeSpan span = Convert.ToDateTime(strEnd) - Convert.ToDateTime(strFrom);
            //Get Interval Data
            TimeIntervalChartDraw graph = TimeIntervalChartDraw.Instance;
            #region Draw Chart Area
            IntervalChartArea chartArea = new IntervalChartArea(100, 150, 800, 430);
            graph.colorSplit = 8;
            graph.IniGraphics(ChartDraw.ChartImg);
            graph.AddChartArea(chartArea);
            #endregion
            DataTable dtSQL = new DataTable("SQLTabel");
            DataTable dtInterval = new DataTable("IntervalTabel");
            dtInterval.Columns.Add("x", typeof(int));
            dtInterval.Columns.Add("y", typeof(int));
            #region Draw Grid
            Int32 yMid = Convert.ToInt32(textMid.Text);
            Int32 yMax = Convert.ToInt32(textMax.Text);
            span = Convert.ToDateTime(strEnd) - Convert.ToDateTime(strFrom);
            LegendGrid grid = new LegendGrid(Convert.ToInt32(span.TotalHours), yMid);
            graph.AddAxis(grid);
            #endregion
            #region Get Source Data
            strSQL = "select to_char(birth_date,'yyyy-MM-dd hh24:mi:ss') as dateChar from lca.lca_data2 where to_char(birth_date,'yyyy-MM-dd hh24:mi:ss') between '" + strFrom + "' and '" + strEnd + "'  and lca_line='"+strCellNo+"'  order by birth_date";
            dtSQL = oleUtility.SQLQuery_DataTable(strSQL);
            if (dtSQL.Rows.Count == 0)
            {
                return null;
            }
            #endregion
            int intRed = 0;
            int intGreen = 0;
            int intYellow = 0;
            IntervalBar barPoint = new IntervalBar();
            DataRow newIntervalRow = dtInterval.NewRow();
            span = Convert.ToDateTime(dtSQL.Rows[0][0].ToString()) - Convert.ToDateTime(strFrom);
            newIntervalRow[0] = span.TotalSeconds;
            newIntervalRow[1] = span.TotalSeconds;
            #region Draw Point
            if (Convert.ToInt32(newIntervalRow[1]) >= yMid && Convert.ToInt32(newIntervalRow[1]) < yMax)
            {
                barPoint.BarHeight = yMid;
                barPoint.BarColor = Color.Yellow;
                intYellow++;
            }
            else if (Convert.ToInt32(newIntervalRow[1]) >= yMax)
            {
                barPoint.BarHeight = yMid;
                barPoint.BarColor = Color.Orchid;
                intRed++;
            }
            else
            {
                barPoint.BarHeight = Convert.ToInt32(newIntervalRow[1]);
                barPoint.BarColor = Color.LightSkyBlue;
                intGreen++;
            }
            barPoint.XStart = 0;
            barPoint.YStart = barPoint.BarHeight;
            barPoint.BarWidth = Convert.ToInt32(newIntervalRow[1]);

            graph.DrawBarPoint(barPoint);
            dtInterval.Rows.Add(newIntervalRow);

            for (int i = 1; i < dtSQL.Rows.Count; i++)
            {

                newIntervalRow = dtInterval.NewRow();
                span = Convert.ToDateTime(dtSQL.Rows[i][0].ToString()) - Convert.ToDateTime(strFrom);
                newIntervalRow[0] = span.TotalSeconds;
                newIntervalRow[1] = span.TotalSeconds - Convert.ToInt32(dtInterval.Rows[i - 1][0].ToString());


                if (Convert.ToInt32(newIntervalRow[1]) >= yMid && Convert.ToInt32(newIntervalRow[1]) < yMax)
                {
                    barPoint.BarHeight = yMid;
                    barPoint.BarColor = Color.Yellow;
                    intYellow++;
                }
                else if (Convert.ToInt32(newIntervalRow[1]) >= yMax)
                {
                    barPoint.BarHeight = yMid;
                    barPoint.BarColor = Color.Orchid;
                    intRed++;
                }
                else
                {
                    barPoint.BarHeight = Convert.ToInt32(newIntervalRow[1]);
                    barPoint.BarColor = Color.LightSkyBlue;
                    intGreen++;
                }

                barPoint.YStart = barPoint.BarHeight;
                barPoint.BarWidth = Convert.ToInt32(newIntervalRow[1]);
                barPoint.XStart = Convert.ToInt32(newIntervalRow[0]) - Convert.ToInt32(newIntervalRow[1]);

                graph.DrawBarPoint(barPoint);
                dtInterval.Rows.Add(newIntervalRow);

            }
            #endregion
            //graph.AddSeries(dtInterval);

            graph.AddCountLabel(intRed, intGreen, intYellow);
            graph.DrawStartLabel(dtSQL.Rows[0][0].ToString());
            graph.DrawEndLabel(dtSQL.Rows[dtSQL.Rows.Count - 1][0].ToString());
            #endregion
            String fileName = "";
            switch (LbxShift.SelectedItem.ToString())
            {
                case "All Shift":
                    fileName = "LineDT" + startDateTime.ToString("yyyy-MM-dd"); break;
                case "Day":
                    fileName = "LineDT" + startDateTime.ToString("yyyy-MM-dd") + "M"; break;
                case "Night":
                    fileName = "LineDT" + startDateTime.ToString("yyyy-MM-dd") + "N"; break;
            }
            DGVlineHourly.DataSource = dtNew;
            buManualImport.Enabled = true;
            //dataDriver.WriteDataToFile(dtNew, fileName);
            tabControl1.SelectedTab = TPLineHourly;
            //ChartDraw.saveImg(fileName);
            //ChartForm newForm = new ChartForm();
            //newForm.Text = ChartDraw.ImgFileName;
            //newForm.Height = ChartDraw.ChartHeight;
            //newForm.Width = ChartDraw.ChartWitdh;
            //newForm.BackgroundImage = ChartDraw.ChartImg;
            //newForm.BackgroundImageLayout = ImageLayout.Stretch;

            graph.saveImg(fileName);
            graph.saveWebImg(fileName);
            ChartForm newForm = new ChartForm();
            newForm.Text = graph.ImgFileName;
            newForm.Height = ChartDraw.ChartHeight;
            newForm.Width = ChartDraw.ChartWitdh;
            newForm.BackgroundImage = graph.ChartImg;
            newForm.BackgroundImageLayout = ImageLayout.Stretch;

            return dtOutput;
            //newForm.Show();
        }