/// <summary> /// 构造函数 /// </summary> /// <param name="DataSheet">图表对应的数据工作表</param> /// <param name="DrawingChart">Excel图形所在的Chart对象</param> /// <param name="ParentApp">此图表所在的Excel类的实例对象</param> /// <param name="type">此图表所属的类型,由枚举drawingtype提供</param> /// <param name="CanRoll">是图表是否可以滚动,即是动态图还是静态图</param> /// <param name="Info">图表中用来显示相关信息的那个文本框对象</param> /// <param name="DrawingTag">每一个监测曲线图的相关信息</param> /// <param name="MonitorType">监测数据的类型,比如测斜数据、立柱垂直位移数据、支撑轴力数据等</param> /// <remarks></remarks> public ClsDrawing_Mnt_Base(Excel.Worksheet DataSheet, Microsoft.Office.Interop.Excel.Chart DrawingChart, Cls_ExcelForMonitorDrawing ParentApp, DrawingType type, bool CanRoll, Excel.TextFrame2 Info, MonitorInfo DrawingTag, MntType MonitorType) { try { //设置Excel窗口与Chart的尺寸 this.F_Application = ParentApp.Application; ExcelFunction.SetLocation_Size(this.ChartSize_sugested, DrawingChart, this.Application, true); // this.Sheet_Data = DataSheet; this.F_myChart = DrawingChart; this.F_textbox_Info = Info; this.Sheet_Drawing = DrawingChart.Parent.Parent; this.F_blnCanRoll = CanRoll; this.F_DrawingType = type; this.P_MntType = MonitorType; //将此对象添加进其所属的集合中 F_Class_ParentApp = ParentApp; // this.P_Key = System.Convert.ToInt32(F_Class_ParentApp.Mnt_Drawings.Add(this)); this.F_UniqueID = GeneralMethods.GetUniqueID(); // this.Tags = DrawingTag; } catch (Exception ex) { MessageBox.Show("创建基本监测曲线图出错。" + "\r\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }
/// <summary> /// 绘制动态曲线图 /// </summary> /// <param name="p_dicDate_ChosenDatum"></param> /// <param name="arrChosenTags"></param> /// <param name="arrDataDisplacement"></param> /// <returns></returns> /// <remarks></remarks> private Chart DrawDynamicChart(Dictionary <DateTime, object[]> p_dicDate_ChosenDatum, string[] arrChosenTags, object[,] arrDataDisplacement) { //dic_Date_ChosenDatum以每一天的日期来索引这一天的监测数据,监测数据只包含列表中选择了的监测点 Chart r_myChart = default(Chart); F_shtDrawing.Activate(); //--------------------------------------------------------------- 在工作表“标高图”中添加图表 r_myChart = F_shtDrawing.Shapes.AddChart(XlChartType.xlLineMarkers).Chart; //---------- 选定模板 string t_path = System.IO.Path.Combine(System.Convert.ToString(My.Settings.Default.Path_Template), Constants.FolderOrFileName.File_Template.Chart_Horizontal_Dynamic); // 如果监测曲线图所使用的"Chart模板"有问题,则在chart.ChartArea.Copy方法(或者是chartObject.Copy方法)中可能会出错。 r_myChart.ApplyChartTemplate(t_path); //-------------------- 获取图表中的信息文本框 F_textbox_Info = r_myChart.Shapes[0].TextFrame2; //Chart中的Shapes集合的第一个元素的下标值为0 //textbox_Info.AutoSize = Microsoft.Office.Core.MsoAutoSize.msoAutoSizeShapeToFitText //------------------------ 设置曲线的数据 DateTime Date_theFirstCurve = System.Convert.ToDateTime(p_dicDate_ChosenDatum.Keys(0)); SeriesCollection mySeriesCollection = r_myChart.SeriesCollection(); Series series = mySeriesCollection.Item(1); series.Name = Date_theFirstCurve.ToString(); //系列名称 series.XValues = arrChosenTags; //X轴的数据 series.Values = p_dicDate_ChosenDatum.Item(Date_theFirstCurve); //Y轴的数据 // this.F_TheFirstseriesTag = new clsDrawing_Mnt_RollingBase.SeriesTag(series, Date_theFirstCurve); //------------------------ 设置X、Y轴的格式——监测点位编号 dynamic with_3 = r_myChart.Axes(XlAxisType.xlCategory); with_3.AxisTitle.Text = GetAxisLabel(DrawingType.Monitor_Dynamic, this.F_MonitorType, XlAxisType.xlCategory); //-设置Y轴的格式——测点位移 Axis axes = r_myChart.Axes(XlAxisType.xlValue); //由数据的最小与最大值来划分表格区间 float imin = (float)(F_AppDrawing.WorksheetFunction.Min(arrDataDisplacement)); float imax = (float)(F_AppDrawing.WorksheetFunction.Max(arrDataDisplacement)); //主要与次要刻度单位,先确定刻度单位是为了后面将坐标轴的区间设置为主要刻度单位的倍数 float unit = float.Parse(Strings.Format((imax - imin) / ClsDrawing_Mnt_OtherDynamics.cstChartParts_Y, "0.0E+00")); //这里涉及到有效数字的处理的问题 axes.MajorUnit = unit; axes.MinorUnitIsAuto = true; //坐标轴上显示的总区间 axes.MinimumScale = F_AppDrawing.WorksheetFunction.Floor_Precise(imin, axes.MajorUnit); axes.MaximumScale = F_AppDrawing.WorksheetFunction.Ceiling_Precise(imax, axes.MajorUnit); //坐标轴标题 axes.AxisTitle.Text = GetAxisLabel(DrawingType.Monitor_Dynamic, this.F_MonitorType, XlAxisType.xlValue); return(r_myChart); }
/// <summary> /// 开始绘制开挖剖面图的Chart对象 /// </summary> /// <returns>进行绘图的Chart对象的高度值,以磅为单位,可以用来确定Excel Application的高度值</returns> /// <remarks>绘图时,标高值与Excel中的Y坐标值的对应关系: /// 在程序中,定义了eleTop变量(以米为单位)与F_sngTopRef变量(以磅为单位), /// 它们指示的是此基坑区域中,地下室顶板的标高值与其在Excel绘图中对应的Y坐标值</remarks> private Microsoft.Office.Interop.Excel.Chart DrawChart(Microsoft.Office.Interop.Excel.Worksheet DrawingSheet, List <clsData_ProcessRegionData> SelectedRegion) { Microsoft.Office.Interop.Excel.Application DrawingApp = DrawingSheet.Application; DrawingApp.ScreenUpdating = false; DrawingApp.Caption = "开挖标高图"; //---------------- 创建一个新的,进行绘图的Chart对象 ------------------------------- Excel.Chart DrawingChart = default(Excel.Chart); DrawingChart = DrawingSheet.Shapes.AddChart(Top: 0, Left: 0).Chart; string TemplatePath = System.IO.Path.Combine(System.Convert.ToString(My.Settings.Default.Path_Template), Constants.FolderOrFileName.File_Template.Chart_Elevation); DrawingChart.Parent.Activate(); DrawingChart.ApplyChartTemplate(TemplatePath); this.F_Textbox_Info = DrawingChart.Shapes.Item(1).TextFrame2; DrawingChart.ChartTitle.Text = "开挖标高图"; // Microsoft.Office.Interop.Excel.SeriesCollection src = DrawingChart.SeriesCollection(); for (short i = 0; i <= 1 - src.Count; i++) //确保Chart中至少有两个数据系列 { src.NewSeries(); } // ----------------------- 设置绘图及Excel窗口的尺寸 ---------------------------- double ChartHeight = 400; double InsideLeft = 60; double InsideRight = 20; double LeastWidth_Chart = 500; double LeastWidth_Column = 100; // double ChartWidth = LeastWidth_Chart; double insideWidth = LeastWidth_Chart - InsideLeft - InsideRight; // ChartWidth = GetChartWidth(DrawingChart, SelectedRegion.Count, LeastWidth_Chart, LeastWidth_Column, InsideLeft + InsideRight, ref insideWidth); ChartSize Size_Chart_App = new ChartSize(ChartHeight, ChartWidth, 26, 9); ExcelFunction.SetLocation_Size(Size_Chart_App, DrawingChart, DrawingChart.Application, true); //With DrawingChart.PlotArea // .InsideLeft = InsideLeft // .InsideWidth = insideWidth //End With // -------------------------------------------------- return(DrawingChart); }
/// <summary> /// 构造函数 /// </summary> /// <param name="Series_Static">表示基坑区域的坑底深度的数据系列</param> /// <param name="Series_Depth">表示基坑区域的即时开挖标高的数据系列</param> /// <param name="ChosenRegion">此绘图中所包含的矩形方块与对应的数据范围</param> /// <param name="textbox">记录信息的文本框</param> /// <param name="type">此图表所属的类型,由枚举DrawingType提供</param> public ClsDrawing_ExcavationElevation(Microsoft.Office.Interop.Excel.Series Series_Static, Series Series_Depth, List <clsData_ProcessRegionData> ChosenRegion, DateSpan DateSpan, Microsoft.Office.Interop.Excel.TextFrame2 textbox, DrawingType type) { ClsDrawing_ExcavationElevation with_1 = this; with_1.F_Series_Static = Series_Static; with_1.F_Series_Depth = Series_Depth; with_1.F_textbox_Info = textbox; with_1.P_Chart = Series_Static.Parent.Parent; with_1.P_Sheet_Drawing = this.P_Chart.Parent.parent; with_1.Application = this.P_Sheet_Drawing.Application; with_1.F_Regions = ChosenRegion; with_1.DateSpan = DateSpan; with_1.P_Type = type; with_1.Application.Caption = ""; with_1.P_UniqueID = GeneralMethods.GetUniqueID(); // ------------------------------------------------------------- GlobalApplication.Application.ElevationDrawing = this; }
/// <summary> /// 构造函数 /// </summary> /// <param name="DataSheet">图表对应的数据工作表</param> /// <param name="DrawingChart">Excel图形所在的Chart对象</param> /// <param name="ParentApp">此图表所在的Excel类的实例对象</param> /// <param name="type">此图表所属的类型,由枚举drawingtype提供</param> /// <param name="CanRoll">是图表是否可以滚动,即是动态图还是静态图</param> /// <param name="DateSpan">此图表的TimeSpan跨度</param> /// <remarks></remarks> public clsDrawing_Mnt_RollingBase(Excel.Worksheet DataSheet, Excel.Chart DrawingChart, Cls_ExcelForMonitorDrawing ParentApp, DrawingType type, bool CanRoll, Excel.TextFrame2 Info, MonitorInfo DrawingTag, MntType MonitorType, DateSpan DateSpan, SeriesTag theFirstSeriesTag) : base(DataSheet, DrawingChart, ParentApp, type, CanRoll, Info, DrawingTag, MonitorType) { // VBConversions Note: Non-static class variable initialization is below. Class variables cannot be initially assigned non-static values in C#. F_Chart = this.Chart; // this.DateSpan = DateSpan; //刷新滚动窗口的列表框的界面显示 APPLICATION_MAINFORM.MainForm.Form_Rolling.OnRollingDrawingsRefreshed(); //启用主界面的程序滚动按钮 APPLICATION_MAINFORM.MainForm.MainUI_RollingObjectCreated(); //--------------------------- 设置与数据系列的曲线相关的属性值 clsDrawing_Mnt_RollingBase with_1 = this; //以数据列中第一个元素作为进行滚动的那个series with_1.MovingSeries = theFirstSeriesTag.series; // ----- 集合数据的记录 with_1.F_DicSeries_Tag.Add(cst_LboundOfSeriesInCollection, theFirstSeriesTag); //刚开始时,图表中只有一条数据曲线 with_1.F_CurvesCount = 1; // this.F_List_HasCurve.Clear(); this.F_List_HasCurve.Add(true); //第一个数据列是有曲线的,所以将其值设置为true Excel.SeriesCollection seriesColl = Chart.SeriesCollection() as Excel.SeriesCollection; for (var i = 1; i <= seriesColl.Count - 1; i++) { this.F_List_HasCurve.Add(false); } // -----对图例进行更新--------- LegendRefresh(F_List_HasCurve); }
/// <summary> /// 构造函数 /// </summary> /// <param name="Series"></param> /// <param name="ConstructionDate"></param> /// <param name="DepthLine">与数据系列相关联的挖深直线</param> /// <param name="DepthText">与数据系列相关联的文本框</param> /// <remarks></remarks> public SeriesTag_Incline(Excel.Series Series, DateTime ConstructionDate, Shape DepthLine = null, TextFrame2 DepthText = null) : base(Series, ConstructionDate) { P_DepthLine = DepthLine; P_DepthText = DepthText as Excel.Shape; }
/// <summary> /// 构造函数 /// </summary> /// <param name="DataSheet">图表对应的数据工作表</param> /// <param name="DrawingChart">Excel图形所在的Chart对象</param> /// <param name="ParentApp">此图表所在的Excel类的实例对象</param> /// <param name="DateSpan">此图表的TimeSpan跨度</param> /// <param name="type">此图表的类型,则枚举DrawingType提供</param> /// <param name="CanRoll">是图表是否可以滚动,即是动态图还是静态图</param> /// <param name="date_ColNum">此测斜点的监测数据工作表中的每一天与其在工作表中对应的列号, /// 以监测数据的日期key索引数据所在列号item</param> /// <param name="usedRg">监测曲线的数据范围,此Range对象中, /// 包括此工作表的UsedRange中的第一列,即深度的数据;但是不包括第一行的日期数据</param> /// <param name="Info">记录数据信息的文本框</param> /// <param name="FirstSeriesTag">第一条数据系列对应的Tag信息</param> /// <param name="ProcessRegionData">在施工进度工作表中,每一个基坑区域相关的各种信息,比如区域名称,区域的描述, /// 区域数据的Range对象,区域所属的基坑ID及其ID的数据等</param> /// <remarks></remarks> public ClsDrawing_Mnt_Incline(Excel.Worksheet DataSheet, Excel.Chart DrawingChart, Cls_ExcelForMonitorDrawing ParentApp, DateSpan DateSpan, DrawingType type, bool CanRoll, TextFrame2 Info, MonitorInfo DrawingTag, MntType MonitorType, Dictionary <DateTime, int> date_ColNum, Excel.Range usedRg, SeriesTag_Incline FirstSeriesTag, clsData_ProcessRegionData ProcessRegionData = null) : base(DataSheet, DrawingChart, ParentApp, type, CanRoll, Info, DrawingTag, MonitorType, DateSpan, new clsDrawing_Mnt_RollingBase.SeriesTag(FirstSeriesTag.series, FirstSeriesTag.ConstructionDate)) { // // -------------------------------------------- try { ClsDrawing_Mnt_Incline with_1 = this; with_1.P_rgMntData = usedRg; //'包括第一列,但是不包括第一行的日期。 Excel.Range colRange = usedRg.Columns[1] as Excel.Range; with_1.F_YValues = ExcelFunction.ConvertRangeDataToVector <Single>(colRange); with_1.Information = Info; with_1._ExcavationDepth_lineAndTextbox = FirstSeriesTag; with_1.F_dicDateAndColumnNumber = date_ColNum; with_1.P_ProcessRegionData = ProcessRegionData; with_1._inclineTopElevaion = Project_Expo.InclineTopElevaion; // ----- 集合数据的记录 with_1.F_DicSeries_Tag[(int)LowIndexOfObjectsInExcel.SeriesInSeriesCollection] = FirstSeriesTag; // -----对图例进行更新--------- //Call LegendRefresh(List_HasCurve) } catch (Exception ex) { MessageBox.Show("构造测斜曲线图出错。" + "\r\n" + ex.Message + "\r\n" + ex.TargetSite.Name, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }
/// <summary> /// 绘制静态曲线图 /// </summary> /// <param name="arrChosenTags"></param> /// <param name="arrDateRange"></param> /// <param name="AllSelectedMonitorData"></param> /// <param name="dicSeries_Data"></param> /// <returns></returns> /// <remarks></remarks> private Chart DrawStaticChart(string[] arrChosenTags, double[] arrDateRange, object[,] AllSelectedMonitorData, Dictionary <Series, object[]> dicSeries_Data) { // Chart r_myChart = default(Chart); F_shtDrawing.Activate(); //--------------------------------------------------------------- 在工作表“标高图”中添加图表 r_myChart = F_shtDrawing.Shapes.AddChart().Chart; //---------- 选定模板 string t_path = System.IO.Path.Combine(System.Convert.ToString(My.Settings.Default.Path_Template), Constants.FolderOrFileName.File_Template.Chart_Horizontal_Static); // 如果监测曲线图所使用的"Chart模板"有问题,则在chart.ChartArea.Copy方法(或者是chartObject.Copy方法)中可能会出错。 r_myChart.ApplyChartTemplate(t_path); //-------------------- 获取图表中的信息文本框 F_textbox_Info = r_myChart.Shapes[0].TextFrame2; //Chart中的Shapes集合的第一个元素的下标值为0 //textbox_Info.AutoSize = Microsoft.Office.Core.MsoAutoSize.msoAutoSizeShapeToFitText //----------------------------- 对于数据系列的集合,开始为每一行数据添加新的曲线 SeriesCollection mySeriesCollection = r_myChart.SeriesCollection(); Series eachSeries = default(Series); if (mySeriesCollection.Count < arrChosenTags.Length) { for (byte i = 1; i <= arrChosenTags.Length - mySeriesCollection.Count; i++) { mySeriesCollection.NewSeries(); } } else { for (var i = 1; i <= mySeriesCollection.Count - arrChosenTags.Length; i++) //删除集合中的元素,先锁定要删的那个元素的下标,然后删n次(因为每次删除后其后面的又填补上来了) { mySeriesCollection[arrChosenTags.Length].delete(); } } byte i2 = (byte)0; foreach (string tag in arrChosenTags) { eachSeries = mySeriesCollection[i2]; //数据系列集合中的第一条曲线的下标值为0 object[] arrselectedDataWithDate = new object[Information.UBound((System.Array)AllSelectedMonitorData, 2) + 1]; for (int i_col = 0; i_col <= Information.UBound((System.Array)AllSelectedMonitorData, 2); i_col++) { arrselectedDataWithDate[i_col] = AllSelectedMonitorData[i2, i_col]; } eachSeries.Name = arrChosenTags[i2]; //系列名称 eachSeries.XValues = arrDateRange; //X轴的数据:每一天的施工日期 eachSeries.Values = arrselectedDataWithDate; //Y轴的数据 dicSeries_Data.Add(eachSeries, arrselectedDataWithDate); i2++; } //------------------------ 设置X、Y轴的格式 //——整个施工日期跨度 Axis axesX = r_myChart.Axes(XlAxisType.xlCategory); axesX.CategoryType = XlCategoryType.xlTimeScale; //绘制坐标轴的数值区间 axesX.MaximumScale = System.Convert.ToDouble(Max_Array <double>(arrDateRange)); axesX.MinimumScale = System.Convert.ToDouble(Min_Array <double>(arrDateRange)); //.MaximumScaleIsAuto = True //.MinimumScaleIsAuto = True axesX.TickLabels.NumberFormatLocal = "yy/M/d"; axesX.TickLabelSpacingIsAuto = true; axesX.AxisTitle.Text = GetAxisLabel(DrawingType.Monitor_Static, this.F_MonitorType, XlAxisType.xlCategory); //-设置Y轴的格式——测点位移 Axis axesY = r_myChart.Axes(XlAxisType.xlValue); //坐标轴标题 axesY.AxisTitle.Text = GetAxisLabel(DrawingType.Monitor_Static, this.F_MonitorType, XlAxisType.xlValue); //由数据的最小与最大值来划分表格区间 float imin = (float)(F_AppDrawing.WorksheetFunction.Min(AllSelectedMonitorData)); float imax = (float)(F_AppDrawing.WorksheetFunction.Max(AllSelectedMonitorData)); //主要与次要刻度单位,先确定刻度单位是为了后面将坐标轴的区间设置为主要刻度单位的倍数 float unit = float.Parse(Strings.Format((imax - imin) / ClsDrawing_Mnt_Static.cstChartParts_Y, "0.0E+00")); //这里涉及到有效数字的处理的问题 try { axesY.MajorUnit = unit; //有可能会出现unit的值为0.0的情况 } catch (Exception) { axesY.MajorUnitIsAuto = true; } axesY.MinorUnitIsAuto = true; //坐标轴上显示的总区间 axesY.MinimumScale = F_AppDrawing.WorksheetFunction.Floor_Precise(imin, axesY.MajorUnit); axesY.MaximumScale = F_AppDrawing.WorksheetFunction.Ceiling_Precise(imax, axesY.MajorUnit); return(r_myChart); }