Files
ATV_STDLabelAttach/Handler/Project/UIControl/CtlCylinder.cs
2025-09-09 17:24:19 +09:00

262 lines
9.2 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace UIControl
{
public partial class CtlCylinder : CtlBase
{
// string text_;
Font font_ = new Font("Malgun Gothic", 10);
public enum eSensorType
{
SingleAction = 0,
DoubleAction,
}
private eSensorType _arsensortype = eSensorType.SingleAction;
public eSensorType arSensorType
{
get
{
return _arsensortype;
}
set
{
_arsensortype = value;
this.Invalidate();
}
}
[Browsable(true)]
public new Font Font { get { return font_; } set { font_ = value; this.Invalidate(); } }
public CtlCylinder()
{
InitializeComponent();
SetPinCount(4); //입력2개 출력2개
arOutputMax.ValueDirection = eValueDirection.output;
arOutputMin.ValueDirection = eValueDirection.output;
if (arVel == 0) arVel = 50;
//실린더 가동핀은 변경되면 시작시간을 업데이트해줘야 한다
PinList[0].ValueChanged += (s1, e1) => { RunStartTimeMax = DateTime.Now; };
PinList[1].ValueChanged += (s1, e1) => { RunStartTimeMin = DateTime.Now; };
}
public override void MakeRect()
{
}
public int arLength = 100;
public int arVel { get; set; }
public DateTime RunStartTimeMin = DateTime.Now;
public DateTime RunStartTimeMax = DateTime.Now;
// public TimeSpan arRunSec = new TimeSpan(0);
private double arRunLen = 0;
public double arProgress
{
get
{
var val = (arRunLen / (arLength * 1.0) * 100.0);
if (val > 100.0) val = 100;
return val;
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public PinInfo arOutputMax { get { return PinList[2]; } set { PinList[2] = value; } }
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public PinInfo arOutputMin { get { return PinList[3]; } set { PinList[3] = value; } }
//Boolean aron1_ = false;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public PinInfo arInput1
{
get
{
return PinList[0];
}
set
{
//if (value != aron1_) RunStartTimeMax = DateTime.Now;
PinList[0] = value;
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public PinInfo arInput2
{
get
{
return PinList[1];
}
set
{
// if (value != aron2_) RunStartTimeMin = DateTime.Now;
PinList[1] = value;
this.Invalidate();
}
}
public Rectangle arRectProgress { get; set; }
public override void UpdateValue()
{
//둘다 켜져잇거나 거져잇다면 작동하지 않는다
if (arInput1 != arInput2)
{
if (arSensorType == eSensorType.SingleAction)
{
var ts = DateTime.Now - RunStartTimeMax;
//단동은 1번 센서의 on/off 로 처리한다
if (arInput1.Value)
{
//경과시간만큼 MAX로 이동한다
arRunLen += ts.TotalSeconds * arVel;
}
else
{
//경과시간만큼 MIN으로 이동한다
arRunLen -= ts.TotalSeconds * arVel;
}
RunStartTimeMax = DateTime.Now;
}
else
{
//복동은 1번센서는 Max로 2번센서는 Min으로 이동시킨다
if (arInput1.Value)
{
var ts = DateTime.Now - RunStartTimeMax;
arRunLen += ts.TotalSeconds * arVel;
RunStartTimeMax = DateTime.Now;
}
else if (arInput2.Value)
{
var ts = DateTime.Now - RunStartTimeMin;
arRunLen -= ts.TotalSeconds * arVel;
RunStartTimeMin = DateTime.Now;
}
}
}
if (arRunLen > arLength) arRunLen = arLength;
if (arRunLen < 1) arRunLen = 0;
arOutputMax.Raw = arProgress >= 99.9;
arOutputMin.Raw = arProgress <= 0.1;
// public Boolean arMax { get { return arProgress >= 99.9; } }
//public Boolean arMin { get { return arProgress <= 0.1; } }
}
protected override void OnPaint(PaintEventArgs pe)
{ // base.OnPaint(pe);
pe.Graphics.DrawRectangle(Pens.Gray, DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1);
var baseRect = new Rectangle(DisplayRectangle.Left + Padding.Left,
DisplayRectangle.Top + Padding.Top,
DisplayRectangle.Width - Padding.Left - Padding.Right,
DisplayRectangle.Height - Padding.Top - Padding.Bottom);
//pe.Graphics.DrawRect(baseRect, Color.Blue, 1);
//사각형안에 사각형이 움직이는 걸로 하며 . 기본 H 배치한다
var rectH = (int)(baseRect.Height * 0.6);
var rectOut = new Rectangle(baseRect.Left,
(int)(baseRect.Top + (baseRect.Height - rectH) / 2.0),
(int)(baseRect.Width), rectH);
var InOffset = (int)(baseRect.Height * 0.15);
//var rectIn = new Rectangle(rectOut.Right, rectOut.Top + InOffset,
// DisplayRectangle.Width - rectOut.Width - 2, rectOut.Height - (InOffset * 2));
//진행율(%)
var progress = (arProgress / 100.0) * rectOut.Width;
var PWid = 10;
var rectP = new Rectangle((int)(progress - PWid + baseRect.Left), baseRect.Top, PWid, baseRect.Height);
pe.Graphics.FillRectangle(Brushes.Gray, rectOut);
pe.Graphics.DrawRect(rectOut, Color.Black, 2);
//pe.Graphics.DrawRect(rectIn, Color.Black, 2);
if (this.arOutputMax.Value)
pe.Graphics.FillRectangle(Brushes.Red, rectP);
else if (this.arOutputMin.Value)
pe.Graphics.FillRectangle(Brushes.Blue, rectP);
else
pe.Graphics.FillRectangle(Brushes.Gold, rectP);
pe.Graphics.DrawRect(rectP, Color.Black, 2);
//가동상태를 상단에 표시한다
var StSize = 10;// baseRect.Height * 0.15f;
var rectp1 = new RectangleF(
this.DisplayRectangle.Right - StSize - 3,
DisplayRectangle.Top + 3,
StSize, StSize
);
if (arInput1.Value)
pe.Graphics.FillRectangle(Brushes.Red, rectp1);
else
pe.Graphics.FillRectangle(Brushes.Gray, rectp1);
pe.Graphics.DrawRect(rectp1, Color.White);
if (arSensorType == eSensorType.DoubleAction)
{
var rectp2 = new RectangleF(
this.DisplayRectangle.Right - StSize - 3,
DisplayRectangle.Bottom - StSize - 3,
StSize, StSize
);
if (arInput2.Value)
pe.Graphics.FillRectangle(Brushes.Red, rectp2);
else
pe.Graphics.FillRectangle(Brushes.Gray, rectp2);
pe.Graphics.DrawRect(rectp2, Color.White);
}
// if (arMin)
// {
// pe.Graphics.DrawString("MIN", this.Font, Brushes.Black, rectOut,
// new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
// }
// else if(arMax)
// {
// pe.Graphics.DrawString("MAX", this.Font, Brushes.Black, rectOut,
//new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
// }
// else
// {
// pe.Graphics.DrawString(arProgress.ToString("N0")+"%", this.Font, Brushes.Black, rectOut,
//new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
// }
if (string.IsNullOrEmpty(Text) == false)
{
pe.Graphics.DrawString(Text + "\n" + progress.ToString(),
this.Font,
Brushes.Black,
rectOut,
new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
}
}
}
}