- UIControl 프로젝트 구조 변경 (CapCleaningControl → Sub/UIControl) - arAjinextek 라이브러리 통합 및 구조 개선 - 새로운 arAjinextek_Union 프로젝트 추가 - 솔루션 파일에 README.md 추가 - QR 모드에서 WMS RCV 태그 인식 기능 강화 - 데이터베이스 스키마 업데이트 및 관련 클래스 수정 - 프린터 및 바코드 장치 연동 로직 개선 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
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);
|
|
|
|
}
|
|
}
|
|
}
|