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
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public partial class TimeBlockRangePanel : Panel
|
{
|
/// <summary>
|
/// 10分钟一个刻度
|
/// </summary>
|
private int _calcSpaceMinute = 10;
|
|
/// <summary>
|
/// 绘制对象列表
|
/// </summary>
|
List<TimeSmallBlock> _block_item_list = null;
|
public Action OnFreshPumpRunRange = null;
|
public List<CalcModel.PumpRunRange> 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<CalcModel.PumpRunRange> listRange = new List<CalcModel.PumpRunRange>();
|
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();
|
}
|
|
/// <summary>
|
/// 初始化数据
|
/// </summary>
|
public void InitialTimeBlock(int CalcSpaceMinute)
|
{
|
var anaSetting = IStation.AnaGlobalParas.Setting;
|
if (anaSetting == null)
|
return;
|
|
_block_item_list = new List<TimeSmallBlock>();
|
|
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();
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="start"></param>
|
/// <param name="end"></param>
|
/// <param name="pumpCount"></param>
|
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();
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="templates"></param>
|
internal void SetRangePumpCount(DateTime anaDay, List<CalcModel.PumpRunRange> 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();
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="anaPrj"></param>
|
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();
|
}
|
/// <summary>
|
/// 初始化项大小
|
/// </summary>
|
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();
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="point"></param>
|
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;
|
/// <summary>
|
/// 是否是选择状态
|
/// </summary>
|
bool _isSelectBlockIng = false;
|
|
|
/// <summary>
|
/// 鼠标点击事件
|
/// </summary>
|
/// <param name="e"></param>
|
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);
|
}
|
|
|
/// <summary>
|
/// 鼠标移动事件
|
/// </summary>
|
/// <param name="e"></param>
|
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();
|
}
|
|
/// <summary>
|
/// 鼠标弹出事件
|
/// </summary>
|
/// <param name="e"></param>
|
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;
|
}
|
|
|
}
|
|
|
/// <summary>
|
/// 重绘事件
|
/// </summary>
|
/// <param name="e"></param>
|
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);
|
}
|
}
|
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="eventargs"></param>
|
protected override void OnResize(EventArgs eventargs)
|
{
|
base.OnResize(eventargs);
|
//InitialItemSize();
|
this.Refresh();
|
}
|
|
|
|
|
|
#endregion
|
|
|
}
|
}
|