Initial commit
This commit is contained in:
261
Handler/Project/UIControl/CtlCylinder.cs
Normal file
261
Handler/Project/UIControl/CtlCylinder.cs
Normal file
@@ -0,0 +1,261 @@
|
||||
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("맑은 고딕", 10);
|
||||
public enum eSensorType
|
||||
{
|
||||
단동 = 0,
|
||||
복동,
|
||||
}
|
||||
private eSensorType _arsensortype = eSensorType.단동;
|
||||
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.단동)
|
||||
{
|
||||
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.복동)
|
||||
{
|
||||
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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user