You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lj_plc/Controls/Mesnac.Controls.ChemicalWei.../HslConveyer.cs

300 lines
15 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesnac.Controls.ChemicalWeighing
{
/// <summary>一个传送带的控件</summary>
[Description("传送带控件,支持正反方向设置,支持转速设置,颜色设置")]
public class HslConveyer : UserControl
{
private StringFormat sf = (StringFormat)null;
private float moveSpeed = 0.3f;
private float startAngle = 0.0f;
private float startOffect = 0.0f;
private Timer timer = (Timer)null;
private bool isConveyerActive = false;
private float circularRadius = 20f;
private HslConveyerStyle conveyerStyle = HslConveyerStyle.Horizontal;
/// <summary>必需的设计器变量。</summary>
private IContainer components = (IContainer)null;
/// <summary>实例化一个传送带的控件对象</summary>
public HslConveyer()
{
this.InitializeComponent();
this.sf = new StringFormat();
this.sf.Alignment = StringAlignment.Center;
this.sf.LineAlignment = StringAlignment.Center;
this.SetStyle(ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
base.ForeColor = Color.FromArgb(142, 196, 216);
this.timer = new Timer();
this.timer.Interval = 50;
this.timer.Tick += new EventHandler(this.Timer_Tick);
this.timer.Start();
}
/// <summary>获取或设置控件的背景色</summary>
[Browsable(true)]
[Description("获取或设置控件的背景色")]
[Category("HslControls")]
[DefaultValue(typeof(Color), "Transparent")]
[EditorBrowsable(EditorBrowsableState.Always)]
public override Color BackColor
{
get => base.BackColor;
set => base.BackColor = value;
}
/// <summary>获取或设置当前控件的文本</summary>
[Browsable(true)]
[Description("获取或设置当前控件的文本")]
[Category("HslControls")]
[EditorBrowsable(EditorBrowsableState.Always)]
[Bindable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public override string Text
{
get => base.Text;
set
{
base.Text = value;
this.Invalidate();
}
}
/// <summary>获取或设置控件的背景色</summary>
[Browsable(true)]
[Description("获取或设置控件的前景色")]
[Category("HslControls")]
[DefaultValue(typeof(Color), "[142, 196, 216]")]
[EditorBrowsable(EditorBrowsableState.Always)]
public override Color ForeColor
{
get => base.ForeColor;
set
{
base.ForeColor = value;
this.Invalidate();
}
}
/// <summary>获取或设置传送带流动的速度0为静止正数为正向流动负数为反向流动一般情况值范围为 -9 ~ 9</summary>
[Browsable(true)]
[Description("获取或设置传送带流动的速度0为静止正数为正向流动负数为反向流动一般情况值范围为 -9 ~ 9")]
[Category("HslControls")]
[DefaultValue(0.3f)]
public virtual float MoveSpeed
{
get => this.moveSpeed;
set
{
this.moveSpeed = value;
this.Invalidate();
}
}
/// <summary>获取或设置管道线是否激活液体显示</summary>
[Browsable(true)]
[Description("获取或设置管道线是否激活液体显示")]
[Category("HslControls")]
[DefaultValue(false)]
public virtual bool ConveyerActive
{
get => this.isConveyerActive;
set
{
this.isConveyerActive = value;
this.Invalidate();
}
}
/// <summary>获取或设置两侧的圆圈的半径当且仅当ConveyerStyle属性不为Horizontal枚举时成立</summary>
[Browsable(true)]
[Description("获取或设置两侧的圆圈的半径当且仅当ConveyerStyle属性不为Horizontal枚举时成立")]
[Category("HslControls")]
[DefaultValue(HslConveyerStyle.Horizontal)]
public virtual float CircularRadius
{
get => this.circularRadius;
set
{
if ((double)value > (double)(this.Width / 2) || (double)value > (double)(this.Height / 2))
return;
this.circularRadius = value;
this.Invalidate();
}
}
/// <summary>获取或设置传送带的样式,水平,还是上坡,还是下坡</summary>
[Browsable(true)]
[Description("获取或设置传送带的样式,水平,还是上坡,还是下坡")]
[Category("HslControls")]
[DefaultValue(HslConveyerStyle.Horizontal)]
public virtual HslConveyerStyle ConveyerStyle
{
get => this.conveyerStyle;
set
{
this.conveyerStyle = value;
this.Invalidate();
}
}
private void Timer_Tick(object sender, EventArgs e)
{
if ((double)this.moveSpeed == 0.0)
return;
if (this.isConveyerActive)
{
this.startOffect -= this.moveSpeed;
if ((double)this.startOffect <= -10.0 || (double)this.startOffect >= 10.0)
this.startOffect = 0.0f;
}
this.startAngle += (float)((double)this.moveSpeed * 180.0 / Math.PI / 10.0);
while ((double)this.startAngle < -360.0)
this.startAngle += 360f;
while ((double)this.startAngle >= 360.0)
this.startAngle -= 360f;
this.Invalidate();
}
/// <summary>重绘控件的界面信息</summary>
/// <param name="e">事件</param>
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
this.PaintHslControls(e.Graphics, this.Width, this.Height);
base.OnPaint(e);
}
/// <inheritdoc cref="M:HslControls.HslArrow.PaintHslControls(System.Drawing.Graphics,System.Single,System.Single)" />
public void PaintHslControls(Graphics g, int width, int height)
{
int margin = 5;
int offect = 5;
if (this.conveyerStyle == HslConveyerStyle.Horizontal)
this.PaintMain(g, (float)width, (float)height, (float)margin, (float)offect);
else if (this.conveyerStyle == HslConveyerStyle.Upslope)
{
PointF pointF1 = new PointF((float)(margin + offect) + this.circularRadius, (float)(height - 1 - margin - offect) - this.circularRadius);
PointF pointF2 = new PointF((float)(width - margin - offect - 1) - this.circularRadius, (float)(margin + offect) + this.circularRadius);
float num1 = (float)Math.Sqrt(Math.Pow((double)pointF2.Y - (double)pointF1.Y, 2.0) + Math.Pow((double)pointF2.X - (double)pointF1.X, 2.0));
float num2 = (float)(Math.Acos(((double)pointF2.X - (double)pointF1.X) / (double)num1) * 180.0 / Math.PI);
g.TranslateTransform(pointF1.X, pointF1.Y);
g.RotateTransform(-num2);
g.TranslateTransform((float)(-margin - offect) - this.circularRadius, (float)(-margin - offect) - this.circularRadius);
this.PaintMain(g, (float)((double)num1 + (double)(2 * margin) + (double)(2 * offect) + 2.0 * (double)this.circularRadius), (float)(2 * margin + 2 * offect) + 2f * this.circularRadius, (float)margin, (float)offect);
g.ResetTransform();
}
else
{
PointF pointF3 = new PointF((float)(margin + offect) + this.circularRadius, (float)(margin + offect) + this.circularRadius);
PointF pointF4 = new PointF((float)(width - margin - offect - 1) - this.circularRadius, (float)(height - 1 - margin - offect) - this.circularRadius);
float num = (float)Math.Sqrt(Math.Pow((double)pointF4.Y - (double)pointF3.Y, 2.0) + Math.Pow((double)pointF4.X - (double)pointF3.X, 2.0));
float angle = (float)(Math.Acos(((double)pointF4.X - (double)pointF3.X) / (double)num) * 180.0 / Math.PI);
g.TranslateTransform(pointF3.X, pointF3.Y);
g.RotateTransform(angle);
g.TranslateTransform((float)(-margin - offect) - this.circularRadius, (float)(-margin - offect) - this.circularRadius);
this.PaintMain(g, (float)((double)num + (double)(2 * margin) + (double)(2 * offect) + 2.0 * (double)this.circularRadius), (float)(2 * margin + 2 * offect) + 2f * this.circularRadius, (float)margin, (float)offect);
g.ResetTransform();
}
}
private void PaintMain(Graphics g, float width, float height, float margin, float offect)
{
float num1 = (float)(((double)height - (double)margin * 2.0 - (double)offect * 2.0) / 2.0);
float startAngle = this.startAngle;
Pen pen1 = new Pen(this.ForeColor, 1f);
Pen pen2 = new Pen(this.ForeColor, (double)num1 > 100.0 ? 7f : ((double)num1 > 20.0 ? 5f : ((double)num1 > 5.0 ? 3f : 1f)));
pen2.StartCap = LineCap.Round;
pen2.EndCap = LineCap.Round;
Brush brush = (Brush)new SolidBrush(this.ForeColor);
GraphicsPath path = new GraphicsPath();
path.AddArc(margin, margin, (float)((double)num1 * 2.0 + (double)offect * 2.0), (float)((double)num1 * 2.0 + (double)offect * 2.0), 90f, 180f);
path.AddLine(margin + offect + num1, margin, (float)((double)width - (double)margin - (double)offect - (double)num1 - 1.0), margin);
path.AddArc((float)((double)width - (double)margin - (double)num1 * 2.0 - (double)offect * 2.0), margin, (float)((double)num1 * 2.0 + (double)offect * 2.0), (float)((double)num1 * 2.0 + (double)offect * 2.0), -90f, 180f);
path.CloseFigure();
g.DrawPath(pen1, path);
g.DrawEllipse(pen1, margin + offect, margin + offect, num1 * 2f, num1 * 2f);
g.DrawEllipse(pen1, (float)((double)width - (double)margin - (double)num1 * 2.0) - offect, margin + offect, num1 * 2f, num1 * 2f);
float num2 = (float)Math.Sqrt(2.0 * (double)offect * (double)num1 + (double)offect * (double)offect);
float num3 = (float)(Math.Asin((double)num1 / ((double)num1 + (double)offect)) * 180.0 / Math.PI);
path.Reset();
path.AddArc(margin, margin, (float)((double)num1 * 2.0 + (double)offect * 2.0), (float)((double)num1 * 2.0 + (double)offect * 2.0), -num3, num3 * 2f);
path.AddLine(margin + offect + num1 + num2, height - margin - offect, (float)((double)width - (double)margin - (double)offect - (double)num1 - 1.0) - num2, height - margin - offect);
path.AddArc((float)((double)width - (double)margin - (double)num1 * 2.0 - (double)offect * 2.0), margin, (float)((double)num1 * 2.0 + (double)offect * 2.0), (float)((double)num1 * 2.0 + (double)offect * 2.0), 180f - num3, num3 * 2f);
path.CloseFigure();
g.DrawPath(pen1, path);
g.TranslateTransform(margin + offect + num1, margin + offect + num1);
g.RotateTransform(startAngle);
g.DrawLine(pen2, (float)(-(double)num1 / 2.0), 0.0f, num1 / 2f, 0.0f);
g.DrawLine(pen2, 0.0f, (float)(-(double)num1 / 2.0), 0.0f, num1 / 2f);
g.RotateTransform(-startAngle);
g.TranslateTransform(-margin - offect - num1, -margin - offect - num1);
g.TranslateTransform(width - margin - num1 - offect, margin + offect + num1);
g.RotateTransform(startAngle);
g.DrawLine(pen2, (float)(-(double)num1 / 2.0), 0.0f, num1 / 2f, 0.0f);
g.DrawLine(pen2, 0.0f, (float)(-(double)num1 / 2.0), 0.0f, num1 / 2f);
g.RotateTransform(-startAngle);
g.TranslateTransform(-width + margin + num1 + offect, -margin - offect - num1);
if (this.isConveyerActive)
{
using (Pen pen3 = new Pen(this.ForeColor, 5f))
{
pen3.DashStyle = DashStyle.Custom;
pen3.DashPattern = new float[2] { 5f, 5f };
pen3.DashOffset = this.startOffect;
path.Reset();
path.AddArc(margin + offect / 2f, margin + offect / 2f, num1 * 2f + offect, num1 * 2f + offect, 90f, 180f);
path.AddLine((float)((double)margin + (double)offect + (double)num1 + 1.0), margin + offect / 2f, (float)((double)width - (double)margin - (double)offect - (double)num1 - 2.0), margin + offect / 2f);
path.AddArc((float)((double)width - (double)margin - (double)num1 * 2.0 - (double)offect * 2.0 + (double)offect / 2.0), margin + offect / 2f, num1 * 2f + offect, num1 * 2f + offect, -90f, 180f);
path.CloseFigure();
g.DrawPath(pen3, path);
}
}
g.DrawString(this.Text, this.Font, brush, new RectangleF(0.0f, 0.0f, width, height), this.sf);
path.Dispose();
pen1.Dispose();
pen2.Dispose();
brush.Dispose();
}
/// <summary>清理所有正在使用的资源。</summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && this.components != null)
this.components.Dispose();
base.Dispose(disposing);
}
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
this.AutoScaleMode = AutoScaleMode.None;
this.BackColor = Color.Transparent;
this.Name = nameof(HslConveyer);
this.Size = new Size(461, 61);
this.ResumeLayout(false);
}
}
}