private void LoadData(C3DFile file, Int32 cid) { if (file == null) { return; } C3DParameterCache cache = C3DParameterCache.CreateCache(file); C3DHeaderEvent[] events = file.Header.GetAllHeaderEvents(); UInt16 firstFrameIndex = file.Header.FirstFrameIndex; UInt16 lastFrameIndex = file.Header.LastFrameIndex; UInt16 samplePerFrame = cache.AnalogSamplesPerFrame; this._points = new Dictionary <Single, Single>(); this._status = new ChartScaleStatus(firstFrameIndex, lastFrameIndex, Single.MaxValue, Single.MinValue); for (Int32 i = 0; i < samplePerFrame; i++) { this.lvItems.Columns.Add(new ColumnHeader() { Text = String.Format("SP {0}", (i + 1).ToString()), Width = 70 }); } for (Int32 i = 0; i < file.AllFrames.Count; i++) { Int32 index = firstFrameIndex + i; C3DAnalogSamples point3D = file.AllFrames[i].AnalogSamples[cid]; for (Int32 j = 0; j < point3D.SampleCount; j++) { this._points[index + (Single)(j) / (Single)(point3D.SampleCount)] = point3D[j]; this._status.Mins[1] = Math.Min(this._status.Mins[1], point3D[j]); this._status.Maxs[1] = Math.Max(this._status.Maxs[1], point3D[j]); } String[] item = new String[file.AllFrames[i].AnalogSamples[cid].SampleCount + 1]; item[0] = (file.Header.FirstFrameIndex + i).ToString(); for (Int32 j = 1; j < item.Length; j++) { item[j] = point3D[j - 1].ToString("F3"); } this.lvItems.Items.Add(new ListViewItem(item)); } this._status.Maxs[0] = (this._status.Maxs[0] == this._status.Mins[0] ? this._status.Maxs[0] + 1 : this._status.Maxs[0]); this._status.Maxs[1] = (this._status.Maxs[1] == this._status.Mins[1] ? this._status.Maxs[1] + 1 : this._status.Maxs[1]); ChartBindingHelper.BindDataToChart <Single, Single>(this.chartView, this._points, this._status.Mins[0], this._status.Maxs[0], this._status.Mins[1], this._status.Maxs[1]); this.ShowStripLine(events, cache.FrameRate); this.SetMarker(); }
/// <summary> /// 缩放图表 /// </summary> /// <param name="chart">图表控件</param> /// <param name="status">图表状态</param> /// <param name="type">轴类型(0为X轴,1为Y轴)</param> /// <param name="scale">缩放等级</param> internal static void ZoomChart(Chart chart, ChartScaleStatus status, Byte type, Int32 scale) { Axis axis = (type == 0 ? chart.ChartAreas[0].AxisX : chart.ChartAreas[0].AxisY); Int32 newScale = status.Scales[type] + scale; if (scale == 0 || newScale == 0)//重置 { axis.Maximum = status.Maxs[type]; axis.Minimum = status.Mins[type]; axis.ScaleView.ZoomReset(0); status.Scales[type] = 0; } else { if (newScale > 0)//图表区域小于显示区域 { Double diff = status.Maxs[type] - status.Mins[type]; axis.Maximum = status.Maxs[type] + diff * 0.1 * Math.Pow(1.5, newScale); axis.Minimum = status.Mins[type] - diff * 0.1 * Math.Pow(1.5, newScale); } else if (newScale < 0 && scale < 0)//图表区域大于显示区域 放大 { Double diff = axis.ScaleView.ViewMaximum - axis.ScaleView.ViewMinimum; Double vMin = axis.ScaleView.ViewMinimum + diff * 0.1 * (1.0 + Math.Pow(1.5, newScale)); Double vMax = axis.ScaleView.ViewMaximum - diff * 0.1 * (1.0 + Math.Pow(1.5, newScale)); if (vMin >= vMax) { return; } axis.ScaleView.Zoom(vMin, vMax - vMin, DateTimeIntervalType.Number, true); } else if (newScale < 0 && scale > 0)//图表区域大于显示区域 缩小 { axis.ScaleView.ZoomReset(); } status.Scales[type] = newScale; } }