using DevExpress.Drawing;
|
using DevExpress.XtraCharts;
|
using System.Data;
|
using Yw.EPAnet;
|
using Yw.Hydro;
|
using Yw.Model;
|
|
namespace Yw.WinFrmUI
|
{
|
public partial class HydroLossCurveCtrl : DevExpress.XtraEditors.XtraUserControl
|
{
|
public HydroLossCurveCtrl()
|
{
|
InitializeComponent();
|
}
|
|
/// <summary>
|
/// 水力点击事件
|
/// </summary>
|
public event Action<string> HydroClickEvent;
|
|
/// <summary>
|
/// 绑定数据
|
/// </summary>
|
public void SetBindingData
|
(
|
Yw.Model.HydroModelInfo hydroInfo,
|
HydroWorkingVmo working,
|
HydroNodeInfo node,
|
HydroCalcuResult calcuResult = null,
|
bool isHead = false,
|
List<Yw.Vmo.HydroEvaluationVmo> allEvaluationList = null
|
)
|
{
|
var vm = HydroLossCurveHelper.Create(hydroInfo, working, node, calcuResult, isHead, allEvaluationList);
|
SetBindingData(vm);
|
}
|
|
/// <summary>
|
/// 绑定数据
|
/// </summary>
|
public void SetBindingData(HydroLossCurveViewModel vm)
|
{
|
AutoFitAxises(vm?.Items);
|
this.elevBindingSource.DataSource = vm?.Elev?.Items;
|
this.elevBindingSource.ResetBindings(false);
|
this.lossBindingSource.DataSource = vm?.Lower?.Items;
|
this.lossBindingSource.ResetBindings(false);
|
if (vm?.Total != null)
|
{
|
var sb = new StringBuilder();
|
sb.AppendLine($"水头损失:{vm?.Total.HeadLoss:N2}m");
|
sb.AppendLine($"局部损失:{vm?.Total.MinorLoss:N2}m");
|
sb.AppendLine($"沿程损失:{vm?.Total.FrictionLoss:N2}m");
|
var anno = this.chartControl1.AnnotationRepository[0] as DevExpress.XtraCharts.TextAnnotation;
|
anno.Text = sb.ToString();
|
anno.AutoSize = true;
|
}
|
}
|
|
//自动适应刻度
|
private void AutoFitAxises(List<HydroLossCurveItemViewModel> items)
|
{
|
if (items == null || items.Count < 1)
|
{
|
return;
|
}
|
var diagram = this.chartControl1.Diagram as XYDiagram;
|
|
#region X轴
|
|
var allDistances = items.Select(x => x.Distance).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
|
|
#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();
|
var pressMax = allPressMaxList.Max();
|
|
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_CustomDrawCrosshair(object sender, CustomDrawCrosshairEventArgs e)
|
{
|
// Specify the crosshair argument line color, dash style and thickness.
|
e.CrosshairLineElement.Color = Color.Green;
|
e.CrosshairLineElement.LineStyle.DashStyle = DashStyle.DashDot;
|
e.CrosshairLineElement.LineStyle.Thickness = 3;
|
|
// Specify the back color for the crosshair argument axis label.
|
foreach (CrosshairAxisLabelElement axisLabelElement in e.CrosshairAxisLabelElements)
|
{
|
axisLabelElement.BackColor = Color.Blue;
|
axisLabelElement.Text = $"{axisLabelElement.AxisValue:N2}";
|
}
|
|
foreach (CrosshairElementGroup group in e.CrosshairElementGroups)
|
{
|
CrosshairGroupHeaderElement groupHeaderElement = group.HeaderElement;
|
var pt = group.HeaderElement.SeriesPoints.FirstOrDefault();
|
if (pt != null)
|
{
|
var model = pt.Tag as HydroLossCurvePointVieModel;
|
if (model != null)
|
{
|
groupHeaderElement.Text = model.Name;
|
}
|
}
|
// Specify the text, text color and font for the crosshair group header element.
|
|
groupHeaderElement.TextColor = Color.Green;
|
groupHeaderElement.DXFont = new DXFont("SegoeUI", 12, DXFontStyle.Bold);
|
//groupHeaderElement.Text = group.CrosshairElements[0].AxisLabelElement.Text;
|
|
foreach (var ele in group.CrosshairElements)
|
{
|
ele.AxisLabelElement.Text = $"{ele.AxisLabelElement.AxisValue:N1}";
|
ele.AxisLabelElement.DXFont = new DXFont(this.Font.Name, 6);
|
}
|
|
|
//// Obtain the first series.
|
//CrosshairElement element = group.CrosshairElements[0];
|
|
//// Specify the color, dash style and thickness for the crosshair value lines.
|
//element.LineElement.Color = Color.DarkViolet;
|
//element.LineElement.LineStyle.DashStyle = DashStyle.Dash;
|
//element.LineElement.LineStyle.Thickness = 2;
|
|
//// Specify the text color and back color for the crosshair value labels.
|
//element.AxisLabelElement.TextColor = Color.Red;
|
//element.AxisLabelElement.BackColor = Color.Yellow;
|
|
//// Format the text shown for the series in the crosshair cursor label. Specify the text color and marker size.
|
//element.LabelElement.TextColor = Color.Red;
|
//element.LabelElement.MarkerSize = new Size(15, 15);
|
//element.LabelElement.Text = $"高程:{element.SeriesPoint.Values[0]}m";
|
}
|
}
|
|
//点击事件
|
private void chartControl1_MouseClick(object sender, MouseEventArgs e)
|
{
|
ChartHitInfo hitInfo = this.chartControl1.CalcHitInfo(e.Location);
|
if (hitInfo.Series != null)
|
{
|
if (hitInfo.SeriesPoint != null)
|
{
|
var vm = hitInfo.SeriesPoint.Tag as HydroLossCurvePointVieModel;
|
if (vm != null)
|
{
|
this.HydroClickEvent?.Invoke(vm.Code);
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 导出图片
|
/// </summary>
|
public void ExportToImage(string filePath)
|
{
|
this.chartControl1.ExportToImage(filePath, DXImageFormat.Png);
|
}
|
|
|
|
}
|
}
|