using Hydro.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Yw.WinFrmUI.Q3d;
using static Yw.WinFrmUI.Q3d.MapViewEnum;
namespace Yw.WinFrmUI.Q3d
{
[Serializable]
public class NodeViewModel : Q3DNodeCalcModel, IBaseViewModel
{
#region 构造函数
public NodeViewModel()
{
}
public NodeViewModel(PointF position)
{
Position = position;
}
public NodeViewModel(int X, int Y)
{
Position = new PointF(X, Y);
}
#endregion
#region 属性
[Category("基本信息")]
[DisplayName("编号")]
[Browsable(true)]
public new string ID { get { return base.ID; } set { base.ID = value; } }
[Category("基本信息")]
[DisplayName("名称")]
[Browsable(true)]
public new string Name { get { return base.Name; } set { base.Name = value; } }
[Browsable(false)]
public PointF3D Position3D
{
get
{
return new PointF3D(X, Y, Z);
}
set
{
Position = new PointF(value.X, value.Y);
Z = value.Z;
}
}
[Category("基本信息")]
[Description("X坐标")]
[DisplayName("X坐标")]
[Browsable(true)]
public new float X
{
get
{
return base.X;
}
set
{
base.X = value;
}
}
[Category("基本信息")]
[Description("Y坐标")]
[DisplayName("Y坐标")]
[Browsable(true)]
public new float Y
{
get
{
return base.Y;
}
set
{
base.Y = value;
}
}
[Category("基本信息")]
[Description("标高(m)")]
[DisplayName("标高(m)")]
[Browsable(true)]
public new float Z { get { return base.Z; } set { base.Z = value; } }
[Category("基本信息")]
[Description("类型")]
[DisplayName("类型")]
public MapObjectType Type { get { return this.GetTypeString(); } }
[Category("计算参数")]
[Description("最大口径(mm)")]
[DisplayName("最大口径(mm)")]
[Browsable(false)]
public virtual float MaxDiameter { get; set; } = 0;
[Category("计算参数")]
[Description("需水量(m³/h)")]
[DisplayName("需水量(m³/h)")]
[Browsable(true)]
public virtual float Demand { get; set; }
///
/// 模式的编号
///
[Category("计算参数")]
[Description("用水量模式的编号")]
[DisplayName("模式编号")]
[Browsable(true)]
public virtual string PatternID { get; set; }
[Category("其他参数")]
[DisplayName("链表清单")]
[Browsable(true)]
[JsonIgnore]
public LinkViewModelList Links { get; set; } = new LinkViewModelList();
public List ViewLinks
{
get
{
return base.Links.Select(oo => oo as LinkViewModel).ToList();
}
}
//EN_DEMAND 9 实际需水量 EN_HEAD 10 水力水头 EN_PRESSURE 11 压强
[Category("其他参数")]
[Description("选中")]
[DisplayName("位置信息")]
[Browsable(false)]
public PointF Position
{
get { return new PointF(X, Y); }
set { if (value != null) X = value.X; Y = value.Y; }
}
//[Category("其他参数")]
//[Description("标签")]
//[DisplayName("标签")]
//[Editor(typeof(MyEditor), typeof(UITypeEditor))]
//public TagList Tags { get; set; } = null;
[Browsable(false)]
[JsonIgnore]
public String regionName { get; set; } = null;
[Category("其他参数")]
[Description("对象的等级")]
[DisplayName("级别")]
public int Level { get; set; } = 0;
[Category("其他参数")]
[Description("对象的等级")]
[DisplayName("是否显示")]
public bool Visible { get; set; } = true;
[Category("其他参数")]
[Description("ID类型")]
[DisplayName("ID类型")]
[Browsable(false)]
public string IDType => Type.ToString() + "\t" + ID;
#endregion
#region 方法
public void Move(Vector3 vector)
{
X += vector.X;
Y += vector.Y;
Z += vector.Z;
}
public MapObjectType GetTypeString()
{
if (this is JunctionViewModel) return MapObjectType.节点;
if (this is ReservoirViewModel) return MapObjectType.水库;
if (this is TankViewModel) return MapObjectType.水池;
if (this is MeterViewModel) return MapObjectType.水表;
if (this is NozzleViewModel) return MapObjectType.喷头;
if (this is PipeViewModel) return MapObjectType.管线;
if (this is ValveViewModel) return MapObjectType.阀门;
if (this is PumpViewModel) return MapObjectType.水泵;
return MapObjectType.节点;
}
public bool isNode()
{
if (this is JunctionViewModel) return true;
if (this is ReservoirViewModel) return true;
if (this is TankViewModel) return true;
if (this is MeterViewModel) return true;
if (this is NozzleViewModel) return true;
return false;
}
public string ToEmitterString()
{
if (this is NozzleViewModel n)
{
if (n.FlowCoefficient > 0)
return $"{ID}\t{n.FlowCoefficient * Math.Pow(10 / 101.972, 0.5) / 1000 * 60}\r\n";
}
return null;
}
private PointF3D ToPointF3D()
{
return new PointF3D(X, Y, Z);
}
#endregion
}
}