using DevExpress.Charts.Native;
|
using DevExpress.Pdf.Native;
|
using DevExpress.Utils.Drawing;
|
using DevExpress.XtraCharts;
|
using DevExpress.XtraCharts.Native;
|
using DevExpress.XtraEditors;
|
using Dm.Config;
|
using Mapster;
|
using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Data;
|
using System.Drawing;
|
using System.Drawing.Drawing2D;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using System.Windows.Forms;
|
|
namespace Yw.WinFrmUI
|
{
|
public partial class HydroLossCurveCompareCtrl : DevExpress.XtraEditors.XtraUserControl
|
{
|
public HydroLossCurveCompareCtrl()
|
{
|
InitializeComponent();
|
}
|
|
/// <summary>
|
/// 水力点击事件
|
/// </summary>
|
public event Action<string> HydroClickEvent;
|
|
private Yw.Model.HydroModelInfo _hydroInfo = null;//水力信息
|
private Dictionary<HydroWorkingVmo, HydroCalcuResult> _calcuWorkingDict = null;//工况计算字典
|
private Yw.Model.HydroNodeInfo _node = null;//节点
|
|
/// <summary>
|
/// 绑定数据
|
/// 计算不会改变原有水力信息
|
/// </summary>
|
public void SetBindingData
|
(
|
Yw.Model.HydroModelInfo hydroInfo,
|
List<HydroWorkingVmo> allWorkingList,
|
Yw.Model.HydroNodeInfo node,
|
bool isHead = false,
|
List<HydroEvaluationVmo> allEvaluationList = null
|
)
|
{
|
if (hydroInfo == null)
|
{
|
return;
|
}
|
if (allWorkingList == null || allWorkingList.Count < 1)
|
{
|
return;
|
}
|
if (node == null)
|
{
|
return;
|
}
|
var rhs = hydroInfo.Adapt<Yw.Model.HydroModelInfo>();
|
|
var calcuWorkingDict = new Dictionary<HydroWorkingVmo, HydroCalcuResult>();
|
foreach (var working in allWorkingList)
|
{
|
rhs.UpdateWorkingInfo(working.WorkingInfo);
|
var calcuResult = rhs.Calcu(Yw.EPAnet.CalcuMode.MinorLoss, isHead, allEvaluationList);
|
calcuWorkingDict.Add(working, calcuResult);
|
}
|
SetBindingData(rhs, calcuWorkingDict, node);
|
}
|
|
/// <summary>
|
/// 绑定数据
|
/// </summary>
|
public void SetBindingData
|
(
|
Yw.Model.HydroModelInfo hydroInfo,
|
Dictionary<HydroWorkingVmo, HydroCalcuResult> calcuWorkingDict,
|
Yw.Model.HydroNodeInfo node
|
)
|
{
|
if (hydroInfo == null)
|
{
|
return;
|
}
|
if (calcuWorkingDict == null || calcuWorkingDict.Count < 1)
|
{
|
return;
|
}
|
if (node == null)
|
{
|
return;
|
}
|
_hydroInfo = hydroInfo;
|
_calcuWorkingDict = calcuWorkingDict;
|
_node = node;
|
List<HydroLossCurvePointVieModel> elevList = null;
|
foreach (var calcuWorking in calcuWorkingDict)
|
{
|
var vm = HydroLossCurveHelper.Create(hydroInfo, calcuWorking.Key, node, calcuWorking.Value);
|
if (vm == null)
|
{
|
continue;
|
}
|
if (elevList == null)
|
{
|
elevList = vm.Elev?.Items;
|
if (elevList != null && elevList.Count > 0)
|
{
|
this.elevBindingSource.DataSource = elevList;
|
this.elevBindingSource.ResetBindings(false);
|
}
|
}
|
var series = new DevExpress.XtraCharts.Series();
|
var lineSeriesView = new DevExpress.XtraCharts.LineSeriesView();
|
series.View = lineSeriesView;
|
series.LegendTextPattern = calcuWorking.Key.Name;
|
series.Name = calcuWorking.Key.Name;
|
series.CrosshairEnabled = DevExpress.Utils.DefaultBoolean.True;
|
series.CrosshairHighlightPoints = DevExpress.Utils.DefaultBoolean.True;
|
series.CrosshairLabelPattern = calcuWorking.Key.Name + "总水头:{V:N1}m";
|
series.CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True;
|
series.CrosshairTextOptions.EnableAntialiasing = DevExpress.Utils.DefaultBoolean.True;
|
series.ToolTipSeriesPattern = "";
|
this.chartControl1.Series.Add(series);
|
if (vm.Lower != null && vm.Lower.Items != null && vm.Lower.Items.Count > 0)
|
{
|
foreach (var item in vm.Lower.Items)
|
{
|
var seriesPoint = new SeriesPoint(item.X, item.Y);
|
seriesPoint.Tag = item;
|
series.Points.Add(seriesPoint);
|
}
|
}
|
AutoFitAxisesY(vm.Items);
|
}
|
AutoFitAxisesX(elevList);
|
|
}
|
|
//自适应刻度X
|
private void AutoFitAxisesX(List<HydroLossCurvePointVieModel> items)
|
{
|
if (items == null || items.Count < 1)
|
{
|
return;
|
}
|
var diagram = this.chartControl1.Diagram as XYDiagram;
|
|
#region X轴
|
|
var allDistances = items.Select(x => x.X).Distinct().ToList();
|
var distanceMax = allDistances.Max();
|
diagram.AxisX.Tickmarks.MinorVisible = false;
|
diagram.AxisX.WholeRange.SideMarginsValue = 0;
|
if (distanceMax <= 10)
|
{
|
var maxValue = Math.Ceiling(distanceMax);
|
diagram.AxisX.WholeRange.MinValue = 0;
|
diagram.AxisX.WholeRange.MaxValue = maxValue;
|
diagram.AxisX.NumericScaleOptions.GridSpacing = 1;
|
}
|
else if (distanceMax <= 50)
|
{
|
var maxValue = Math.Ceiling(distanceMax / 10);
|
diagram.AxisX.WholeRange.MinValue = 0;
|
diagram.AxisX.WholeRange.MaxValue = maxValue * 10;
|
diagram.AxisX.NumericScaleOptions.GridSpacing = 5;
|
}
|
else if (distanceMax <= 100)
|
{
|
var maxValue = Math.Ceiling(distanceMax / 10);
|
diagram.AxisX.WholeRange.MinValue = 0;
|
diagram.AxisX.WholeRange.MaxValue = maxValue * 10;
|
diagram.AxisX.NumericScaleOptions.GridSpacing = 10;
|
}
|
else if (distanceMax <= 500)
|
{
|
var maxValue = Math.Ceiling(distanceMax / 100);
|
diagram.AxisX.WholeRange.MinValue = 0;
|
diagram.AxisX.WholeRange.MaxValue = maxValue * 100;
|
diagram.AxisX.NumericScaleOptions.GridSpacing = 50;
|
}
|
else if (distanceMax <= 3000)
|
{
|
var maxValue = Math.Ceiling(distanceMax / 100);
|
diagram.AxisX.WholeRange.MinValue = 0;
|
diagram.AxisX.WholeRange.MaxValue = maxValue * 100;
|
diagram.AxisX.NumericScaleOptions.GridSpacing = 100;
|
}
|
else if (distanceMax <= 5000)
|
{
|
var maxValue = Math.Ceiling(distanceMax / 1000);
|
diagram.AxisX.WholeRange.MinValue = 0;
|
diagram.AxisX.WholeRange.MaxValue = maxValue * 1000;
|
diagram.AxisX.NumericScaleOptions.GridSpacing = 200;
|
}
|
else if (distanceMax <= 10000)
|
{
|
var maxValue = Math.Ceiling(distanceMax / 1000);
|
diagram.AxisX.WholeRange.MinValue = 0;
|
diagram.AxisX.WholeRange.MaxValue = maxValue * 1000;
|
diagram.AxisX.NumericScaleOptions.GridSpacing = 1000;
|
}
|
else
|
{
|
|
}
|
|
#endregion
|
}
|
|
//自适应刻度Y
|
private void AutoFitAxisesY(List<HydroLossCurveItemViewModel> items)
|
{
|
if (items == null || items.Count < 1)
|
{
|
return;
|
}
|
var diagram = this.chartControl1.Diagram as XYDiagram;
|
|
|
#region 压力
|
|
var allPressMinList = items.Select(x => Math.Min(Math.Min(x.StartHead, x.EndHead), x.Elev)).ToList();
|
var allPressMaxList = items.Select(x => Math.Max(Math.Max(x.StartHead, x.EndHead), x.Elev)).ToList();
|
|
var pressMin = allPressMinList.Min();
|
pressMin = Math.Min(pressMin, (double)diagram.AxisY.WholeRange.MinValue);
|
var pressMax = allPressMaxList.Max();
|
pressMax = Math.Max(pressMax, (double)diagram.AxisY.WholeRange.MaxValue);
|
|
diagram.AxisY.Tickmarks.MinorVisible = false;
|
diagram.AxisY.WholeRange.SideMarginsValue = 0;
|
diagram.AxisY.CrosshairAxisLabelOptions.EnableAntialiasing = DevExpress.Utils.DefaultBoolean.True;
|
if (pressMax <= 10)
|
{
|
diagram.AxisY.WholeRange.MinValue = Math.Floor(pressMin);
|
diagram.AxisY.WholeRange.MaxValue = 10;
|
diagram.AxisY.NumericScaleOptions.GridSpacing = 1;
|
diagram.AxisY.VisualRange.SetMinMaxValues(0, 10);
|
}
|
else if (pressMax <= 100)
|
{
|
var maxValue = Math.Ceiling(pressMax / 10);
|
diagram.AxisY.WholeRange.MinValue = Math.Floor(pressMin);
|
diagram.AxisY.WholeRange.MaxValue = maxValue * 10;
|
diagram.AxisY.NumericScaleOptions.GridSpacing = 5;
|
diagram.AxisY.VisualRange.SetMinMaxValues(0, maxValue * 10);
|
}
|
else if (pressMax <= 3000)
|
{
|
var maxValue = Math.Ceiling(pressMax / 100);
|
diagram.AxisY.WholeRange.MinValue = Math.Floor(pressMin);
|
diagram.AxisY.WholeRange.MaxValue = maxValue * 100;
|
diagram.AxisY.NumericScaleOptions.GridSpacing = 50;
|
diagram.AxisY.VisualRange.SetMinMaxValues(0, maxValue * 100);
|
}
|
else if (pressMax <= 6000)
|
{
|
var maxValue = Math.Ceiling(pressMax / 1000);
|
diagram.AxisY.WholeRange.MinValue = Math.Floor(pressMin);
|
diagram.AxisY.WholeRange.MaxValue = maxValue * 1000;
|
diagram.AxisY.NumericScaleOptions.GridSpacing = 100;
|
diagram.AxisY.VisualRange.SetMinMaxValues(0, maxValue * 1000);
|
}
|
else
|
{
|
|
}
|
|
#endregion
|
}
|
|
//自定义绘画
|
private void chartControl1_CustomPaint(object sender, DevExpress.XtraCharts.CustomPaintEventArgs e)
|
{
|
DXCustomPaintEventArgs args = e as DXCustomPaintEventArgs;
|
if (args == null)
|
{
|
return;
|
}
|
GraphicsCache g = args.Cache;
|
|
var series = this.chartControl1.Series;
|
var lineSeries = series?.Where(x => x.SeriesView is LineSeriesView).ToList();
|
if (lineSeries == null || lineSeries.Count < 2)
|
{
|
return;
|
}
|
|
|
|
|
|
|
}
|
|
|
}
|
}
|