using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; using Mesnac.Controls.Base; using System.Drawing; using Steema.TeeChart.Styles; using Steema.TeeChart; using System.Windows.Forms; namespace Mesnac.Controls.Default { [ToolboxBitmap(typeof(TChart), "Images.TChart.bmp")] public partial class MCTeeChart : Steema.TeeChart.TChart { #region 类型定义 /// /// 曲线类别 /// public enum CurveTypes { /// /// 超过设定点数累加 /// Accumulate = 0, /// /// 超过设定点数平移 /// Pan = 1 } #endregion #region 字段定义 private const int LINENUM = 12; //支持的最大曲线数 private int _num = 180; //保持的点数 private CurveTypes _curveType = CurveTypes.Accumulate; //曲线类别 private bool _isShowTime = false; //是否显示时间刻度 private bool _isShowLegend = true; //是否显示图例 private string _timeformat = "{0:HH:mm:ss}"; //时间格式 FastLine[] list = new FastLine[LINENUM]; //曲线集合 private bool _isUseMixTime = false; //是否关联密炼时间 private int _mixTime = 0; //密炼时间 private string _mixTimeName = String.Empty; //密炼时间动画 #endregion #region 构造方法 public MCTeeChart() { InitializeComponent(); this.InitMethod(); } public MCTeeChart(IContainer container) { container.Add(this); InitializeComponent(); this.InitMethod(); } #endregion #region 辅助方法 /// /// 初始化方法 /// public void InitMethod() { this.Series.Clear(); this.Legend.Alignment = LegendAlignments.Right; this.Legend.Visible = true; this.Axes.Bottom.Automatic = false; //默认已累加方式显示曲线 this.Axes.Bottom.Maximum = this._num; this.Aspect.ElevationFloat = 345D; this.Aspect.RotationFloat = 345D; this.Aspect.View3D = false; this.Axes.Bottom.Grid.ZPosition = 0D; this.Axes.Depth.Automatic = true; this.Axes.Depth.Grid.ZPosition = 0D; this.Axes.DepthTop.Automatic = true; this.Axes.DepthTop.Grid.ZPosition = 0D; this.Axes.Left.Automatic = true; this.Axes.Left.Grid.ZPosition = 0D; this.Axes.Right.Automatic = true; this.Axes.Right.Grid.ZPosition = 0D; this.Axes.Top.Automatic = true; this.Axes.Top.Grid.ZPosition = 0D; this.Cursor = System.Windows.Forms.Cursors.Default; this.Header.Lines = new string[] {""}; this.Legend.Shadow.Visible = true; this.Legend.Title.Font.Bold = true; this.Legend.Title.Pen.Visible = false; this.Legend.Visible = false; this.Location = new System.Drawing.Point(100, 0); this.Walls.Back.AutoHide = false; this.Walls.Bottom.AutoHide = false; this.Walls.Left.AutoHide = false; this.Walls.Right.AutoHide = false; this.Walls.Right.Visible = true; this.MouseDown += new MouseEventHandler(MultiCurve_MouseDown); this.MouseLeave += new EventHandler(MultiCurve_MouseLeave); this.MouseMove += new MouseEventHandler(MultiCurve_MouseMove); } private void SetCurveName(string value, int i) { if (String.IsNullOrWhiteSpace(value)) { if (list[i] != null) { this.Series.Remove(list[i]); list[i].Dispose(); list[i] = null; } } else { if (list[i] == null) { list[i] = new FastLine(); list[i].ShowInLegend = this._isShowLegend; this.Series.Add(list[i]); } list[i].Title = value; list[i].Visible = true; } } #endregion #region 拖动 const int Band = 5; const int MinWidth = 50; const int MinHeight = 60; /// /// 鼠标在事件源的位置 /// private Point p = new Point(); private enum EnumMousePointPosition { MouseSizeNone = 0, //无 MouseDrag = 9 // 鼠标拖动 } private EnumMousePointPosition m_MousePointPosition; void MultiCurve_MouseMove(object sender, MouseEventArgs e) { Control lCtrl = (sender as Control); if (e.Button == MouseButtons.Left) { switch (m_MousePointPosition) { case EnumMousePointPosition.MouseDrag: if (this.Left > 930) { this.Left = 929; return; } if (this.Top > 374) { this.Top = 373; return; } this.Left = this.Left + e.X - p.X; this.Top = this.Top + e.Y - p.Y; break; default: break; } if (lCtrl.Width < MinWidth) lCtrl.Width = MinWidth; if (lCtrl.Height < MinHeight) lCtrl.Height = MinHeight; } else { m_MousePointPosition = MousePointPosition(lCtrl.Size, e); //'判断光标的位置状态 switch (m_MousePointPosition) //'改变光标 { case EnumMousePointPosition.MouseSizeNone: this.Cursor = Cursors.Arrow; //'箭头 break; case EnumMousePointPosition.MouseDrag: this.Cursor = Cursors.SizeAll; //'四方向 break; default: break; } } } void MultiCurve_MouseLeave(object sender, EventArgs e) { m_MousePointPosition = EnumMousePointPosition.MouseSizeNone; this.Cursor = Cursors.Arrow; } void MultiCurve_MouseDown(object sender, MouseEventArgs e) { p.X = e.X; p.Y = e.Y; } private EnumMousePointPosition MousePointPosition(Size size, System.Windows.Forms.MouseEventArgs e) { if ((e.X >= -1 * Band) | (e.X <= size.Width) | (e.Y >= -1 * Band) | (e.Y <= size.Height)) { if (e.X >= Band) { if (e.X <= -1 * Band + size.Width) { if (e.Y >= Band) { if (e.Y <= -1 * Band + size.Height) { return EnumMousePointPosition.MouseDrag; } else { return EnumMousePointPosition.MouseSizeNone; } } } } } else { return EnumMousePointPosition.MouseSizeNone; } return EnumMousePointPosition.MouseSizeNone; } #endregion #region bHaveAction private bool _bHaveAction; public bool bHaveAction { get { return _bHaveAction; } set { _bHaveAction = value; } } #endregion #region 基本属性 /// /// 数据源 /// [TypeConverter(typeof(DataSourceConverter))] public string MCDataSourceID { get; set; } [Description("曲线的标题,可修改."), Category("Appearance")] public string Title { get { return this.Text; } set { this.Text = value == null ? String.Empty : value; } } /// /// 是否显示时间刻度 /// [Description("是否显示时间"), Category("Appearance")] public bool IsShowTime { get { return this._isShowTime; } set { this._isShowTime = value; } } /// /// 是否显示图例 /// [Description("显示图例"), Category("Appearance")] public bool IsShowLegend { get { return _isShowLegend; } set { _isShowLegend = value; foreach (FastLine line in this.list) { if (line != null) { line.ShowInLegend = _isShowLegend; } } } } /// /// 保持的点数 /// [Description("保持的点数"), Category("Appearance")] public int Num { get { return this._num; } set { this._num = value; if (this._num < 10) { this._num = 10; } if (this._num > 1000) { this._num = 1000; } this.Axes.Bottom.Maximum = this._num; } } /// /// 曲线状态 /// [Description("曲线状态"), Category("Appearance")] public CurveTypes CurveType { get { return _curveType; } set { _curveType = value; if (_curveType == CurveTypes.Pan) { this.Axes.Bottom.Automatic = true; } else { this.Axes.Bottom.Automatic = false; this.Axes.Bottom.Maximum = this._num; } } } /// /// 是否关联密炼时间 /// [Description("关联密炼时间"), Category("Behavior")] public bool IsUseMixTime { get { return _isUseMixTime; } set { _isUseMixTime = value; } } /// /// 密炼时间 /// [Description("密炼时间"), Category("Data")] public int MixTime { get { return _mixTime; } set { _mixTime = value; } } #endregion #region 曲线名称属性定义 [Category("Data"), Description("曲线的名称,可修改.")] public string CurveName1 { get { return list[0] == null ? String.Empty : list[0].Title; } set { SetCurveName(value, 0); } } [Category("Data"), Description("曲线的名称,可修改.")] public string CurveName2 { get { return list[1] == null ? String.Empty : list[1].Title; } set { SetCurveName(value, 1); } } [Category("Data"), Description("曲线的名称,可修改.")] public string CurveName3 { get { return list[2] == null ? String.Empty : list[2].Title; } set { SetCurveName(value, 2); } } [Category("Data"), Description("曲线的名称,可修改.")] public string CurveName4 { get { return list[3] == null ? String.Empty : list[3].Title; } set { SetCurveName(value, 3); } } [Category("Data"), Description("曲线的名称,可修改.")] public string CurveName5 { get { return list[4] == null ? String.Empty : list[4].Title; } set { SetCurveName(value, 4); } } [Category("Data"), Description("曲线的名称,可修改.")] public string CurveName6 { get { return list[5] == null ? String.Empty : list[5].Title; } set { SetCurveName(value, 5); } } [Category("Data"), Description("曲线的名称,可修改.")] public string CurveName7 { get { return list[6] == null ? String.Empty : list[6].Title; } set { SetCurveName(value, 6); } } [Category("Data"), Description("曲线的名称,可修改.")] public string CurveName8 { get { return list[7] == null ? String.Empty : list[7].Title; } set { SetCurveName(value, 7); } } [Category("Data"), Description("曲线的名称,可修改.")] public string CurveName9 { get { return list[8] == null ? String.Empty : list[8].Title; } set { SetCurveName(value, 8); } } [Category("Data"), Description("曲线的名称,可修改.")] public string CurveName10 { get { return list[9] == null ? String.Empty : list[9].Title; } set { SetCurveName(value, 9); } } [Category("Data"), Description("曲线的名称,可修改.")] public string CurveName11 { get { return list[10] == null ? String.Empty : list[10].Title; } set { SetCurveName(value, 10); } } [Category("Data"), Description("曲线的名称,可修改.")] public string CurveName12 { get { return list[11] == null ? String.Empty : list[11].Title; } set { SetCurveName(value, 11); } } #endregion #region 动画属性 /// /// 密炼时间动画属性 /// public string MixTimeName { get { return _mixTimeName; } set { _mixTimeName = value; } } private string[] _pointName = new string[LINENUM]; public string PointName1 { get { return this._pointName[0]; } set { this._pointName[0] = value; } } public string PointName2 { get { return this._pointName[1]; } set { this._pointName[1] = value; } } public string PointName3 { get { return this._pointName[2]; } set { this._pointName[2] = value; } } public string PointName4 { get { return this._pointName[3]; } set { this._pointName[3] = value; } } public string PointName5 { get { return this._pointName[4]; } set { this._pointName[4] = value; } } public string PointName6 { get { return this._pointName[5]; } set { this._pointName[5] = value; } } public string PointName7 { get { return this._pointName[6]; } set { this._pointName[6] = value; } } public string PointName8 { get { return this._pointName[7]; } set { this._pointName[7] = value; } } public string PointName9 { get { return this._pointName[8]; } set { this._pointName[8] = value; } } public string PointName10 { get { return this._pointName[9]; } set { this._pointName[9] = value; } } public string PointName11 { get { return this._pointName[10]; } set { this._pointName[10] = value; } } public string PointName12 { get { return this._pointName[11]; } set { this._pointName[11] = value; } } private void SetPointValue(double value, int i) { if (this._isUseMixTime && this._mixTime == 0) { this.Clear(); } else { if (this.list[i] == null) { list[i] = new FastLine(); list[i].ShowInLegend = this._isShowLegend; //是否显示图例 list[i].Color = this.GetDefaultColor(i); //获取默认颜色 this.Series.Add(list[i]); } if (this._curveType == CurveTypes.Pan) { if (this.list[i].Count >= this._num) { this.list[i].Delete(0, 1, true); } } else { if (this.list[i].Count >= this._num) { this.Num += 10; } } if (this._isShowTime) { this.list[i].Add(value, String.Format(this._timeformat, DateTime.Now)); } else { this.list[i].Add(value); } } } /// /// 获取默认颜色 /// /// 曲线索引 /// 返回默认颜色 private Color GetDefaultColor(int i) { Color[] _colors = { Color.Red, Color.Green, Color.Purple, Color.Blue, Color.Black, Color.FromArgb(0x7b, 0x68, 0xee), Color.FromArgb(0xcd, 0x5c, 0x5c), Color.FromArgb(0xdb, 0x70, 0x93), Color.FromArgb(0x5f, 0x9e, 0xa0), Color.FromArgb(0xdd, 0xa0, 0xdd), Color.FromArgb(0x90, 0xee, 0x90), Color.FromArgb(0xff, 0x00, 0xff), Color.FromArgb(0x48, 0xd1, 0xcc) }; if (i >= _colors.Length - 1) { return Color.Red; } return _colors[i]; } public void Clear() { for (int i = 0; i < list.Length; i++) { //this.list[i].Delete(0, this.list[i].Count, true); if (this.list[i] != null) this.list[i].Clear(); } } public double PointValue1 { set { SetPointValue(value, 0); } } public double PointValue2 { set { SetPointValue(value, 1); } } public double PointValue3 { set { SetPointValue(value, 2); } } public double PointValue4 { set { SetPointValue(value, 3); } } public double PointValue5 { set { SetPointValue(value, 4); } } public double PointValue6 { set { SetPointValue(value, 5); } } public double PointValue7 { set { SetPointValue(value, 6); } } public double PointValue8 { set { SetPointValue(value, 7); } } public double PointValue9 { set { SetPointValue(value, 8); } } public double PointValue10 { set { SetPointValue(value, 9); } } public double PointValue11 { set { SetPointValue(value, 10); } } public double PointValue12 { set { SetPointValue(value, 11); } } #endregion #region 颜色设置 [Category("Data"), Description("曲线颜色,可修改.")] public Color ColorValue1 { get { if (this.list[0] != null) return this.list[0].LinePen.Color; else return this.GetDefaultColor(0); //默认红色 } set { if (this.list[0] != null) { this.list[0].LinePen.Color = value; } } } [Category("Data"), Description("曲线颜色,可修改.")] public Color ColorValue2 { get { if (this.list[1] != null) return this.list[1].LinePen.Color; else return this.GetDefaultColor(1); //默认绿色 } set { if (this.list[1] != null) { this.list[1].LinePen.Color = value; } } } [Category("Data"), Description("曲线颜色,可修改.")] public Color ColorValue3 { get { if (this.list[2] != null) return this.list[2].LinePen.Color; else return this.GetDefaultColor(2); //默认紫色 } set { if (this.list[2] != null) { this.list[2].LinePen.Color = value; } } } [Category("Data"), Description("曲线颜色,可修改.")] public Color ColorValue4 { get { if (this.list[3] != null) return this.list[3].LinePen.Color; else return this.GetDefaultColor(3); //默认蓝色 } set { if (this.list[3] != null) { this.list[3].LinePen.Color = value; } } } [Category("Data"), Description("曲线颜色,可修改.")] public Color ColorValue5 { get { if (this.list[4] != null) return this.list[4].LinePen.Color; else return this.GetDefaultColor(4); //默认黑色 } set { if (this.list[4] != null) { this.list[4].LinePen.Color = value; } } } [Category("Data"), Description("曲线颜色,可修改.")] public Color ColorValue6 { get { if (this.list[5] != null) return this.list[5].LinePen.Color; else return this.GetDefaultColor(5); } set { if (this.list[5] != null) { this.list[5].LinePen.Color = value; } } } [Category("Data"), Description("曲线颜色,可修改.")] public Color ColorValue7 { get { if (this.list[6] != null) return this.list[6].LinePen.Color; else return this.GetDefaultColor(6); } set { if (this.list[6] != null) { this.list[6].LinePen.Color = value; } } } [Category("Data"), Description("曲线颜色,可修改.")] public Color ColorValue8 { get { if (this.list[7] != null) return this.list[7].LinePen.Color; else return this.GetDefaultColor(7); } set { if (this.list[7] != null) { this.list[7].LinePen.Color = value; } } } [Category("Data"), Description("曲线颜色,可修改.")] public Color ColorValue9 { get { if (this.list[8] != null) return this.list[8].LinePen.Color; else return this.GetDefaultColor(8); } set { if (this.list[8] != null) { this.list[8].LinePen.Color = value; } } } [Category("Data"), Description("曲线颜色,可修改.")] public Color ColorValue10 { get { if (this.list[9] != null) return this.list[9].LinePen.Color; else return this.GetDefaultColor(9); } set { if (this.list[9] != null) { this.list[9].LinePen.Color = value; } } } [Category("Data"), Description("曲线颜色,可修改.")] public Color ColorValue11 { get { if (this.list[10] != null) return this.list[10].LinePen.Color; else return this.GetDefaultColor(10); } set { if (this.list[10] != null) { this.list[10].LinePen.Color = value; } } } [Category("Data"), Description("曲线颜色,可修改.")] public Color ColorValue12 { get { if (this.list[11] != null) return this.list[11].LinePen.Color; else return this.GetDefaultColor(11); } set { if (this.list[11] != null) { this.list[11].LinePen.Color = value; } } } #endregion } }