238 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			238 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.ComponentModel;
 | |
| using System.Data;
 | |
| using System.Drawing;
 | |
| using System.Drawing.Drawing2D;
 | |
| using System.Linq;
 | |
| using System.Windows.Forms;
 | |
| 
 | |
| 
 | |
| namespace UIControl
 | |
| {
 | |
|     public partial class HMI
 | |
|     {
 | |
|         void Draw_PickerY(Graphics g, RectangleF rect)
 | |
|         {
 | |
| 
 | |
|             //return;
 | |
| 
 | |
|             //전체영역의 80% 영역에 Y-로봇의 축을 그린다.
 | |
|             //var motorMax = 400; //전체 가동 길이 400mm
 | |
|             var cx = rect_main.Left + rect_main.Width / 2.0f;
 | |
|             var cy = rect_main.Top + rect_main.Height * 0.2f;// / 2.0f - 200;
 | |
| 
 | |
| 
 | |
|             //모터길이가 설정되지않았따면 600으로 설정한다
 | |
|             if (this.arMotorLengthY == 0) this.arMotorLengthY = 600;
 | |
|             var motYPosX = rect.Left + (rect.Width * ((arMotorPosition[0] + 1) / (this.arMotorLengthY * 1.0f)));
 | |
| 
 | |
| 
 | |
| 
 | |
|             //g.DrawString(arMotorPositionYP.ToString() + "/" + motYPosX.ToString(), this.Font, Brushes.Red, 100, 100);
 | |
| 
 | |
|             //Y축 모터의 현재위치를 표시한다
 | |
|             g.DrawLine(new Pen(Color.SteelBlue, 10), (float)motYPosX, rect.Top, (float)motYPosX, rect.Bottom);
 | |
| 
 | |
|             g.DrawLine(new Pen(Color.Black, 1), (float)motYPosX, rect.Top - 5, (float)motYPosX, rect.Bottom + 5);
 | |
| 
 | |
|             //Y축 모터의 영역을 표시한다.
 | |
|             //            g.DrawRect(rect_picker, Color.White, 3);
 | |
| 
 | |
|             if(arPickerSafeZone) g.FillRectangle(Brushes.Lime, rect_picker);
 | |
|             else g.FillRectangle(Brushes.DimGray, rect_picker);
 | |
|             g.DrawString(arMotPosNamePX, arFont_MotPosName, Brushes.Gray, rect_picker, new StringFormat
 | |
|             {
 | |
|                 Alignment = StringAlignment.Near,
 | |
|                 LineAlignment = StringAlignment.Center
 | |
|             });
 | |
|             if (arMotILockPKX) g.DrawRect(rect_picker, Color.Blue, 5);
 | |
|             else g.DrawRect(rect_picker, Color.FromArgb(50, 50, 50), 3);
 | |
| 
 | |
|             //중앙에 Safty Zone 글자 표시함
 | |
|             if(arPickerSafeZone)
 | |
|             {
 | |
|                 g.DrawString("PICKER X - SAFETY ZONE", new Font("Consolas",12, FontStyle.Bold), Brushes.Black, rect_picker, new StringFormat
 | |
|                 {
 | |
|                     Alignment = StringAlignment.Center,
 | |
|                     LineAlignment = StringAlignment.Center
 | |
|                 });
 | |
|             }
 | |
| 
 | |
| 
 | |
|             //Z축 모터의 영역 계산     
 | |
|             var motZLPosX = motYPosX;
 | |
|             //   var motZRPosX = motYPosX + CvtMMtoPX_W(motZSpaceMM / 2, 0);
 | |
|             var motZPosY = rect.Top - CvtMMtoPX_H(50, 0); //Y축하단에서 50mm 아래에 Z축을 표시한다.
 | |
|             var motZHMm = 300;
 | |
|             var motZhPx = CvtMMtoPX_H(motZHMm, 0); //
 | |
|             var motZwPx = rect.Height;
 | |
|             rect_zlaxis = new RectangleF((float)(motZLPosX - motZwPx / 2.0), (float)motZPosY, motZwPx, (float)motZhPx);
 | |
|             //  rect_zraxis = new RectangleF((float)(motZRPosX - motZwPx / 2.0), (float)motZPosY, motZwPx, (float)motZhPx);
 | |
| 
 | |
|             //현재위치를 표시하는 영역생성
 | |
|             var zlSize = g.MeasureString("UNKNOWN", this.Font);
 | |
|             var zrSize = g.MeasureString("UNKNOWN", this.Font);
 | |
|             var zSizeW = Math.Max(zlSize.Width, zrSize.Width);
 | |
|             var zSizeH = Math.Max(zlSize.Height, zrSize.Height);
 | |
|             var rect_zlposname = new RectangleF(
 | |
|                 rect_zlaxis.Left + (rect_zlaxis.Width - zSizeW) / 2.0f,
 | |
|                 rect_zlaxis.Top - zSizeH + 5,
 | |
|                 zSizeW,
 | |
|                 zSizeH);
 | |
| 
 | |
| 
 | |
|             g.FillRectangle(Brushes.DimGray, rect_zlaxis);
 | |
| 
 | |
| 
 | |
|             //테두리
 | |
|             if (arMotILockPKZ == true) g.DrawRect(rect_zlaxis, Color.Blue, 5);
 | |
|             else g.DrawRect(rect_zlaxis, Color.DimGray, 3);
 | |
| 
 | |
| 
 | |
| 
 | |
|             g.FillRectangle(Brushes.DimGray, rect_zlposname);
 | |
| 
 | |
|             if (arMotILockPKZ == true) g.DrawRect(rect_zlposname, Color.Blue, 5);
 | |
|             else g.DrawRect(rect_zlposname, Color.DimGray, 3);
 | |
| 
 | |
| 
 | |
|             //피커Z축위치 표시
 | |
|             g.DrawString(arMotPosNamePZ, arFont_MotPosName, Brushes.Gray, rect_zlposname, new StringFormat
 | |
|             {
 | |
|                 Alignment = StringAlignment.Center,
 | |
|                 LineAlignment = StringAlignment.Center
 | |
|             });
 | |
| 
 | |
| 
 | |
|             //중심점 센서 확인
 | |
|             g.DrawLine(new Pen(Color.Black, 1), (float)motZLPosX, rect.Top - 5, (float)motZLPosX, rect.Bottom + 5);
 | |
| 
 | |
|             //Z축 모터위치와 길이확인
 | |
|             if (this.arMotorLengthZL == 0) this.arMotorLengthZL = 600;
 | |
|             var motZLosY = rect_zlaxis.Top + (rect_zlaxis.Height * ((arMotorPosition[1] + 1) / (this.arMotorLengthZL * 1.0f)));
 | |
| 
 | |
|             //상(Rear), 하(Front)로 영역을 그린다
 | |
|             var port_width = rect_picker_left.Width;// * 3f;
 | |
|             var port_height = rect_picker_left.Height; // rect.Height * 0.2f;
 | |
| 
 | |
|             //New Front Position
 | |
|             var newYF = (float)(motZLPosX - port_width / 2.0);
 | |
|             if (newYF != rect_picker_left.X)
 | |
|             {
 | |
|                 var offset = newYF - rect_picker_left.X;
 | |
|                 this.rect_picker_left.Offset(offset, 0);  //좌표가 변경되었다면 재계산
 | |
|                 this.rect_picker_front_vac1.Offset(offset, 0);
 | |
|                 this.rect_picker_front_vac2.Offset(offset, 0);
 | |
|                 this.rect_picker_front_vac3.Offset(offset, 0);
 | |
|                 this.rect_picker_front_vac4.Offset(offset, 0);
 | |
|             }
 | |
|             if (motZLosY != rect_picker_left.Y)
 | |
|             {
 | |
|                 var offset = (float)(motZLosY - rect_picker_left.Y);
 | |
|                 this.rect_picker_left.Offset(0, offset);  //좌표가 변경되었다면 재계산
 | |
|                 this.rect_picker_front_vac1.Offset(0, offset);
 | |
|                 this.rect_picker_front_vac2.Offset(0, offset);
 | |
|                 this.rect_picker_front_vac3.Offset(0, offset);
 | |
|                 this.rect_picker_front_vac4.Offset(0, offset);
 | |
|             }
 | |
| 
 | |
|             //피커 #1 Circle 색상 
 | |
|             var Bg1 = Color.FromArgb(100, 100, 100);
 | |
|             var Bg2 = Color.FromArgb(160, 160, 160);
 | |
|             if (this.arVar_Picker[0].Overload)
 | |
|             {
 | |
|                 Bg1 = Color.Tomato;
 | |
|                 Bg2 = Color.Red;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 if (this.arVar_Picker[0].ItemOn)
 | |
|                 {
 | |
| 
 | |
|                     //if (this.arVar_Picker[0].isReelDetect)
 | |
|                     //{
 | |
|                         Bg1 = Color.Lime; //.FromArgb(100, 100, 100);
 | |
|                         Bg2 = Color.Green;//.FromArgb(160, 160, 160);
 | |
|                     //}
 | |
|                     //else
 | |
|                     //{
 | |
|                     //    Bg1 = Color.Magenta; //.FromArgb(100, 100, 100);
 | |
|                     //    Bg2 = Color.DarkMagenta;//.FromArgb(160, 160, 160);
 | |
|                     //}
 | |
| 
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     Bg1 = Color.FromArgb(100, 100, 100);
 | |
|                     Bg2 = Color.FromArgb(160, 160, 160);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 
 | |
|             using (var br = new LinearGradientBrush(rect_picker_left, Bg1, Bg2, LinearGradientMode.Vertical))
 | |
|             {
 | |
|                 g.FillEllipse(br, rect_picker_left);
 | |
|             }
 | |
| 
 | |
|             //피커 #2 Circle 색상 
 | |
|             if (this.arVar_Picker[1].Overload)
 | |
|             {
 | |
|                 Bg1 = Color.Tomato;
 | |
|                 Bg2 = Color.Red;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 if (this.arVar_Picker[1].ItemOn)
 | |
|                 {
 | |
|                     //실제 아이템 체크
 | |
| 
 | |
|                     if (this.arVar_Picker[1].isReelDetect)
 | |
|                     {
 | |
|                         Bg1 = Color.Lime; //.FromArgb(100, 100, 100);
 | |
|                         Bg2 = Color.Green;//.FromArgb(160, 160, 160);
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         Bg1 = Color.Magenta; //.FromArgb(100, 100, 100);
 | |
|                         Bg2 = Color.DarkMagenta;//.FromArgb(160, 160, 160);
 | |
|                     }
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     Bg1 = Color.FromArgb(100, 100, 100);
 | |
|                     Bg2 = Color.FromArgb(160, 160, 160);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 
 | |
|             //피커 테두리
 | |
|             using (var bgPen = new Pen(Color.Black, 3))
 | |
|             {
 | |
|                 var posT = arMotorPosition[6];
 | |
|                 g.DrawEllipse(bgPen, rect_picker_left);
 | |
|                 g.DrawString(posT.ToString("N0"), this.Font, Brushes.Black, rect_picker_left,new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
 | |
|             }
 | |
| 
 | |
|             //피커 내부의 진공 표현
 | |
|             g.FillEllipse((this.arVar_Picker[0].VacOutput[0] ? brVacOn : brVacOff), rect_picker_front_vac1);
 | |
|             g.FillEllipse((this.arVar_Picker[0].VacOutput[1] ? brVacOn : brVacOff), rect_picker_front_vac2);
 | |
|             g.FillEllipse((this.arVar_Picker[0].VacOutput[2] ? brVacOn : brVacOff), rect_picker_front_vac3);
 | |
|             g.FillEllipse((this.arVar_Picker[0].VacOutput[3] ? brVacOn : brVacOff), rect_picker_front_vac4);
 | |
| 
 | |
|             //피커설명 표시
 | |
|             if (arVar_Picker[0].Overload)
 | |
|                 g.DrawString("OVL", arFont_picker, Brushes.Black, rect_picker_left, sfCenter);
 | |
|             else
 | |
|                 g.DrawString(this.arVar_Picker[0].PortPos, arFont_picker, Brushes.Black, rect_picker_left, sfCenter);
 | |
| 
 | |
|             //피커 진공표시 테두리 (진공출력상태에 따라서 색상을 달리 함)
 | |
|             g.DrawEllipse((this.arVar_Picker[0].VacOutput[0] ? penVacOn : penVacOff), rect_picker_front_vac1);
 | |
|             g.DrawEllipse((this.arVar_Picker[0].VacOutput[1] ? penVacOn : penVacOff), rect_picker_front_vac2);
 | |
|             g.DrawEllipse((this.arVar_Picker[0].VacOutput[2] ? penVacOn : penVacOff), rect_picker_front_vac3);
 | |
|             g.DrawEllipse((this.arVar_Picker[0].VacOutput[3] ? penVacOn : penVacOff), rect_picker_front_vac4);
 | |
| 
 | |
|         }
 | |
|     }
 | |
| }
 | 
