using IStation.CalcModel; using IStation.Model; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Windows.Forms; namespace IStation.WinFrmUI { /// /// /// public partial class TimeBlockRangePanel : Panel { /// /// 10分钟一个刻度 /// private int _calcSpaceMinute = 10; /// /// 绘制对象列表 /// List _block_item_list = null; public Action OnFreshPumpRunRange = null; public List GetRunRangeList(DateTime anaDay) { if (_block_item_list == null) { return null; } var anaSetting = IStation.AnaGlobalParas.Setting; if (anaSetting == null) return null; var startHour = anaSetting.StartHourPerDay; var statTime = anaDay.AddHours(startHour); List listRange = new List(); TimeSmallBlock lastSelBlck = null; foreach (var item in _block_item_list) { if (item.PumpCount > 0) { if (lastSelBlck == null) { lastSelBlck = item; } else { if (item.PumpCount == lastSelBlck.PumpCount) continue; listRange.Add(new CalcModel.PumpRunRange() { PumpNumber = lastSelBlck.PumpCount, StartTime = statTime.AddMinutes(lastSelBlck.Index * _calcSpaceMinute), EndTime = statTime.AddMinutes(item.Index * _calcSpaceMinute) }); lastSelBlck = item; } } else {//当前没有选中 if (lastSelBlck != null) {//表示结束了 listRange.Add(new CalcModel.PumpRunRange() { PumpNumber = lastSelBlck.PumpCount, StartTime = statTime.AddMinutes(lastSelBlck.Index * _calcSpaceMinute), EndTime = statTime.AddMinutes(item.Index * _calcSpaceMinute) }); lastSelBlck = null; } } } if(lastSelBlck != null) { var endTime = statTime.AddDays(1); listRange.Add(new CalcModel.PumpRunRange() { PumpNumber = lastSelBlck.PumpCount, StartTime = statTime.AddMinutes(lastSelBlck.Index * _calcSpaceMinute), EndTime = endTime }); } return listRange; } internal void EmptyAllItem() { if (_block_item_list == null) { return; } foreach (var block in _block_item_list) { block.PumpCount = 0; block.IsSelected = false; } this.Refresh(); if (this.OnFreshPumpRunRange != null) { this.OnFreshPumpRunRange(); } } internal void SetSelctItemPumpCount(int pumpCount) { if (_block_item_list == null) { return; } int sel_count = 0; foreach (var block in _block_item_list) { if (block.IsSelected) { sel_count++; block.PumpCount = pumpCount; block.IsSelected = false; } } if (sel_count > 0) this.Refresh(); if (this.OnFreshPumpRunRange != null) { this.OnFreshPumpRunRange(); } } internal void ClearSelect() { if (_block_item_list == null) { return; } int sel_count = 0; foreach (var block in _block_item_list) { if (block.IsSelected) { sel_count++; block.IsSelected = false; } } if (sel_count > 0) this.Refresh(); } /// /// 初始化数据 /// public void InitialTimeBlock(int CalcSpaceMinute) { var anaSetting = IStation.AnaGlobalParas.Setting; if (anaSetting == null) return; _block_item_list = new List(); var startHour = anaSetting.StartHourPerDay; this._calcSpaceMinute = CalcSpaceMinute; var statTime = DateTime.Today.AddDays(startHour); var endTime = statTime.AddDays(1); int blk_index = 0; for (var time = statTime; time < endTime; time = time.AddMinutes(this._calcSpaceMinute)) { var block = new TimeSmallBlock(blk_index, time.Hour, time.Minute); blk_index++; _block_item_list.Add(block); } if (!_block_item_list.Any()) return; #region //if (!string.IsNullOrEmpty(anaSetting.SwitchPumpIgnoreTimes)) //{ // var ttt = anaSetting.SwitchPumpIgnoreTimes.Split( // new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); // foreach (var t in ttt) // { // var ddd = t.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries); // var st = ddd[1].Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); // var ed = ddd[2].Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); // int ed_h = Convert.ToInt32(ed[0]); // if (Convert.ToBoolean(ddd[0])) // { // var IsNexDay = ed_h > 23 ? true : false; // var StartH = Convert.ToInt32(st[0]); // var StartM = Convert.ToInt32(st[1]); // var EndH = ed_h > 23 ? ed_h - 24 : ed_h; // var EndM = Convert.ToInt32(ed[1]); // //foreach(var b in drawBlocks) // //{ // // if(b.Time.Hour >= StartH && b.Time.Minute) // //} // } // } //} //if (!string.IsNullOrEmpty(anaSetting.OpenPumpIgnoreTimes)) //{ // var ttt = anaSetting.OpenPumpIgnoreTimes.Split( // new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); // foreach (var t in ttt) // { // var ddd = t.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries); // var st = ddd[1].Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); // var ed = ddd[2].Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); // int ed_h = Convert.ToInt32(ed[0]); // //CurrentViewModel v = new CurrentViewModel(); // //v.IsUse = Convert.ToBoolean(ddd[0]); // //v.IsNexDay = ed_h > 23 ? true : false; // //v.StartH = Convert.ToInt32(st[0]); // //v.StartM = Convert.ToInt32(st[1]); // //v.EndH = ed_h > 23 ? ed_h - 24 : ed_h; // //v.StartM = Convert.ToInt32(ed[1]); // //list不许开泵时间.Add(v); // } //} #endregion this.InitialItemSize(); } /// /// /// /// /// /// public void SetRangePumpCount(DateTime anaDay, DateTime start, DateTime end, int pumpCount, bool isRefreshUI) { if (_block_item_list == null) { return; } var anaSetting = IStation.AnaGlobalParas.Setting; var startHour = anaSetting.StartHourPerDay; //var space分析步长 = .Default.CalcSpaceMinute; var statTime = anaDay.AddDays(startHour); var endTime = statTime.AddDays(1); int blk_index = 0; for (var time = statTime; time < endTime; time = time.AddMinutes(this._calcSpaceMinute)) { if (time >= start && time <= end) { _block_item_list[blk_index].PumpCount = pumpCount; } _block_item_list[blk_index].IsSelected = false; blk_index++; } if (isRefreshUI) this.Refresh(); } /// /// /// /// internal void SetRangePumpCount(DateTime anaDay, List templates) { var anaSetting = IStation.AnaGlobalParas.Setting; if (_block_item_list == null) { InitialTimeBlock(this._calcSpaceMinute); } var startHour = anaSetting.StartHourPerDay; //var space分析步长 = .Default.CalcSpaceMinute; var statTime = anaDay.AddDays(startHour); var endTime = statTime.AddDays(1); foreach(var template in templates) { int blk_index = 0; for (var time = statTime; time < endTime; time = time.AddMinutes(this._calcSpaceMinute)) { if (time >= template.StartTime && time <= template.EndTime) { _block_item_list[blk_index].PumpCount = template.PumpNumber ; } _block_item_list[blk_index].IsSelected = false; blk_index++; } } this.Refresh(); } /// /// /// /// internal void SetRangePumpCount(CalcModel.AnaPrj anaPrj) { if(anaPrj.CalcSpaceMinute >5) { this._calcSpaceMinute = anaPrj.CalcSpaceMinute; } if (_block_item_list == null ) { InitialTimeBlock(this._calcSpaceMinute); } var anaSetting = IStation.AnaGlobalParas.Setting; var startHour = anaSetting.StartHourPerDay; var anaDay = anaPrj.StartTime.Date; var statTime = anaPrj.StartTime; var endTime = anaPrj.EndTime; foreach (var item in anaPrj.BlockTimes) { int blk_index = 0; for (var time = statTime; time < endTime; time = time.AddMinutes(this._calcSpaceMinute)) { if (time >= item.StartTime && time <= item.EndTime) { _block_item_list[blk_index].PumpCount = item.OpenPumpCount; } _block_item_list[blk_index].IsSelected = false; blk_index++; } } this.Refresh(); } /// /// 初始化项大小 /// public void InitialItemSize() { if (_block_item_list == null || !_block_item_list.Any()) return; int last_right_x = 10; int last_loc_y = 10; for (int i = 0; i < _block_item_list.Count; i++) { var item = _block_item_list[i]; var current_loc_x = last_right_x; if(item.Hour == 12 && item.Minute == 0) { last_loc_y = last_loc_y + item.Height + 10; current_loc_x = 10; item.IsLineStartBlck = true; _block_item_list[i - 1].IsLineEndBlck = true; } if (item.TextVisible) { if (current_loc_x + item.Width > this.Width - 50) { last_loc_y = last_loc_y + item.Height + 10; current_loc_x = 10; item.IsLineStartBlck = true; _block_item_list[i - 1].IsLineEndBlck = true; } } else { if (current_loc_x + item.Width > this.Width - 20) { last_loc_y = last_loc_y + item.Height + 10; current_loc_x = 10; item.IsLineStartBlck = true; _block_item_list[i - 1].IsLineEndBlck = true; } } if (i == 0) { item.IsLineStartBlck = true; } if (i == _block_item_list.Count - 1) { item.IsLineEndBlck = true; } last_right_x = current_loc_x + item.Width; item.Resize(current_loc_x, last_loc_y); } this.Refresh(); } /// /// /// /// private TimeSmallBlock GetCaptureBlock(Point point) { if (_block_item_list == null) return null; for (int index = 0; index < _block_item_list.Count; index++) { var item = _block_item_list[index]; if (!item.ContainsPoint(point)) continue; return item; } return null; } #region override TimeSmallBlock _startSelBlock = null; TimeSmallBlock _endSelBlock = null; /// /// 是否是选择状态 /// bool _isSelectBlockIng = false; /// /// 鼠标点击事件 /// /// protected override void OnMouseDown(MouseEventArgs e) { if(e.Clicks == 2) { _startSelBlock = null; var tipSelBlock = GetCaptureBlock(e.Location); if (tipSelBlock == null) return; if (tipSelBlock.IsSelected) { tipSelBlock.IsSelected = false; } else { tipSelBlock.IsSelected = true; } this.Invalidate(new System.Drawing.Rectangle( (int)tipSelBlock.Rectangle.X, (int)tipSelBlock.Rectangle.Y, tipSelBlock.Width, tipSelBlock.Height));//刷新局部区域 } else if (e.Button == MouseButtons.Left) { _isSelectBlockIng = true; _startSelBlock = GetCaptureBlock(e.Location); } base.OnMouseDown(e); } /// /// 鼠标移动事件 /// /// protected override void OnMouseMove(MouseEventArgs e) { if (!_isSelectBlockIng) return; base.OnMouseMove(e); //foreach (var item in _block_item_list) //{ // item.IsSelected = false; // //if (item.DispColor != null) // //{ // // item.DispColor = null; // // this.Invalidate(item.Rectangle);//刷新局部区域 // //} //} if (_startSelBlock == null) { _startSelBlock = GetCaptureBlock(e.Location); return; } _endSelBlock = GetCaptureBlock(e.Location); if (_endSelBlock == null) return; if (_endSelBlock.Index > _startSelBlock.Index) {//选中 //foreach (var item in _block_item_list) //{ // if (item.Index >= _startSelBlock.Index) // { for (int i = _startSelBlock.Index; i <= _endSelBlock.Index; i++) { var item = _block_item_list[i]; if (!item.IsSelected) { item.IsSelected = true; this.Invalidate(new System.Drawing.Rectangle( (int)item.Rectangle.X, (int)item.Rectangle.Y, item.Width, item.Height));//刷新局部区域 } } // for (int i = _endSelBlock.Index + 1; i < _block_item_list.Count; i++) { var item = _block_item_list[i]; if (_block_item_list[i].IsSelected) { _block_item_list[i].IsSelected = false; this.Invalidate(new System.Drawing.Rectangle( (int)item.Rectangle.X, (int)item.Rectangle.Y, item.Width, item.Height));//刷新局部区域 continue; } break; } } else {//取消选中 foreach (var item in _block_item_list) { if (item.Index >= _endSelBlock.Index && item.Index <= _startSelBlock.Index) { if (item.IsSelected) { item.IsSelected = false; this.Invalidate(new System.Drawing.Rectangle( (int)item.Rectangle.X, (int)item.Rectangle.Y, item.Width, item.Height));//刷新局部区域 } } } } //base.Invalidate(); } /// /// 鼠标弹出事件 /// /// protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (e.Button == MouseButtons.Left) { var endSelBlock = GetCaptureBlock(e.Location); if(endSelBlock != null && _startSelBlock != null && endSelBlock.Index == _startSelBlock.Index) {//单点, 没有拖动 if (!_startSelBlock.IsSelected) { _startSelBlock.IsSelected = true; this.Invalidate(new System.Drawing.Rectangle( (int)_startSelBlock.Rectangle.X, (int)_startSelBlock.Rectangle.Y, _startSelBlock.Width, _startSelBlock.Height));//刷新局部区域 } } _isSelectBlockIng = false; } } /// /// 重绘事件 /// /// protected override void OnPaint(PaintEventArgs e) { if (DesignMode) return; base.OnPaint(e); e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;//抗锯齿 e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; //使绘图质量最高,即消除锯齿 // 设置GDI高质量模式抗锯齿 e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; e.Graphics.CompositingQuality = CompositingQuality.HighQuality; if (_block_item_list != null && _block_item_list.Any()) { foreach (var rect in _block_item_list) { rect.Draw(e.Graphics); } } } /// /// /// /// protected override void OnResize(EventArgs eventargs) { base.OnResize(eventargs); //InitialItemSize(); this.Refresh(); } #endregion } }