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
}
}