262 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			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("맑은 고딕", 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 });
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |