Esempio n. 1
0
File: Sheet.cs Progetto: fberga/Iren
        /// <summary>
        /// Allinea il grafico al range in modo da far combaciare la barra delle ordinate con la prima colonna dell'area dati. Per far questo calcola la dimensione in punti dei label di ordinata e sposta di conseguenza l'area del grafico.
        /// </summary>
        /// <param name="chart">Microsoft.Office.Interop.Excel.Chart da aggiornare.</param>
        /// <param name="rigaGrafico">Microsoft.Office.Interop.Excel.Range a cui il grafico appartiene.</param>
        private void AggiornaGrafici(Excel.Chart chart, Excel.Range rigaGrafico)
        {
            SplashScreen.UpdateStatus("Aggiorno grafici " + chart.Name);

            chart.Refresh();
            //resize dell'area del grafico per adattarla alle ore
            using (Graphics grfx = Graphics.FromImage(new Bitmap(1, 1)))
            {
                grfx.PageUnit          = GraphicsUnit.Point;
                grfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
                float  sizeMax = float.MinValue;
                SizeF  tmpSize;
                double val = chart.Axes(Excel.XlAxisType.xlValue).MinimumScale;

                //controllo anche il fondo scala: se cambia l'ordine di grandezza excel lascia lo spazio nel label come se ci fosse!!
                while (val <= chart.Axes(Excel.XlAxisType.xlValue).MaximumScale)
                {
                    string tmpval = ""
                                    + (val >= 1000 ? Math.Round(val / 1000.0, 1) : val)
                                    + ((val / 1000.0) % 1 == 0 ? ",0" : "")
                                    + (val >= 1000 ? "K" : "");

                    tmpval = tmpval.Replace(".", ",");

                    tmpSize = grfx.MeasureString(tmpval, new Font(chart.Axes(Excel.XlAxisType.xlValue).TickLabels.Font.Name, (float)chart.Axes(Excel.XlAxisType.xlValue).TickLabels.Font.Size));
                    sizeMax = Math.Max(sizeMax, tmpSize.Width);

                    val += chart.Axes(Excel.XlAxisType.xlValue).MajorUnit;
                }

                //MANTENERE ORDINE DI QUESTE ISTRUZIONI
                chart.ChartArea.Left  = rigaGrafico.Left - Math.Ceiling(sizeMax) - 7;       //sposto a destra il grafico
                chart.ChartArea.Width = rigaGrafico.Width + Math.Ceiling(sizeMax) + 4;      //aumento la larghezza del grafico
                Excel.PlotArea plotArea = chart.PlotArea;
                try
                {
                    plotArea.InsideLeft = 0d;                                               //allineo il grafico al bordo sinistro dell'area esterna al grafico
                }
                catch { }
                plotArea.Width = chart.ChartArea.Width + 3;                                 //aumento la larghezza dell'area esterna al grafico
                Marshal.ReleaseComObject(plotArea);
                plotArea = null;

                bool start = TimeZone.CurrentTimeZone.IsDaylightSavingTime(Workbook.DataAttiva);
                bool end   = TimeZone.CurrentTimeZone.IsDaylightSavingTime(Workbook.DataAttiva.AddDays(Struct.intervalloGiorni));

                if (!start || end)
                {
                    chart.ChartArea.Width -= _ws.Range[Range.GetRange(1, _definedNames.GetColFromDate(Date.SuffissoDATA1, Date.GetSuffissoOra(25)))].Width;
                }
            }
            chart.Refresh();
        }
Esempio n. 2
0
            /// <summary>
            /// 根据每天不同的挖深情况,移动挖深线的位置
            /// </summary>
            /// <param name="ExcavationLineAndTextBox">表示挖深深度的直线,文本框中记录有“挖深”二字</param>
            /// <param name="excavElevation"> 当天开挖标高 </param>
            /// <param name="dateThisday">施工当天的日期</param>
            /// <remarks></remarks>
            private void MoveExcavation(SeriesTag_Incline ExcavationLineAndTextBox, float excavElevation,
                                        DateTime dateThisday, TodayState State)
            {
                Shape iline    = ExcavationLineAndTextBox.DepthLine;
                Shape itextbox = ExcavationLineAndTextBox.DepthTextbox;

                //
                if (State == TodayState.DateMatched | State == TodayState.DateNotFound)
                {
                    // 将当天的开挖标高转换为相对于测斜管顶部的深度值
                    float relativedepth = _inclineTopElevaion - excavElevation;
                    //Project_Expo.Elevation_GroundSurface - excavElevation
                    //
                    Excel.Axis axisY    = Chart.Axes(Excel.XlAxisType.xlValue) as Excel.Axis;
                    float      scalemax = (float)axisY.MaximumScale;
                    float      scalemin = (float)axisY.MinimumScale;
                    //
                    float          linetop = 0;
                    Excel.PlotArea plotA   = Chart.PlotArea;
                    //将相对深度值转换与图表坐标系中的深度坐标值!!!!!
                    linetop =
                        (float)(plotA.InsideTop + plotA.InsideHeight * (relativedepth - scalemin) / (scalemax - scalemin));
                    //
                    iline.Visible = MsoTriState.msoCTrue;
                    iline.Top     = linetop;

                    //
                    if (itextbox != null)
                    {
                        itextbox.Visible = MsoTriState.msoCTrue;
                        itextbox.Top     = iline.Top - itextbox.Height;

                        //指示此基坑当前的状态,为向下开挖还是向上建造。
                        string strStatus = "";
                        if (P_ProcessRegionData == null || (!P_ProcessRegionData.HasBottomDate))
                        {
                            strStatus = "挖深/施工深度";
                        }
                        else
                        {
                            int CompareIndex = DateTime.Compare(dateThisday, P_ProcessRegionData.BottomDate);
                            if (CompareIndex < 0) //说明还未开挖到底
                            {
                                strStatus = "挖深";
                            }
                            else if (CompareIndex > 0) //说明已经开挖到底,正在施工上部结构
                            {
                                strStatus = "施工深度";
                            }
                            else if (CompareIndex == 0) //说明刚好开挖到基坑底部
                            {
                                strStatus = "开挖到底";
                            }
                        }
                        itextbox.TextFrame2.TextRange.Text = strStatus + Convert.ToString(relativedepth);
                    }
                }
                else
                {
                    iline.Visible = MsoTriState.msoFalse;
                    //
                    if (itextbox != null)
                    {
                        itextbox.Visible = MsoTriState.msoFalse;
                    }
                }
            }