프로젝트 구조 개선 및 README.md 추가
- 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>
This commit is contained in:
95
Handler/Sub/UIControl/Loader/Draw_PickerPrinter.cs
Normal file
95
Handler/Sub/UIControl/Loader/Draw_PickerPrinter.cs
Normal file
@@ -0,0 +1,95 @@
|
||||
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_PickerPrinter(Graphics g, RectangleF rect,
|
||||
int motAxisY, int motAxisZ, bool reverse,
|
||||
Boolean LockY, Boolean LockZ, Boolean ItemOn, Boolean ItemPickOK,
|
||||
Boolean CylFW, Boolean CylBW)
|
||||
{
|
||||
//실제 로봇의 길이를 입력한다 (단위:mm)
|
||||
var RealLenY = 400;
|
||||
var RealLenZ = 250;
|
||||
|
||||
g.FillRectangle(Brushes.DimGray, rect);
|
||||
if (LockY) g.DrawRect(rect, Color.Blue, 5);
|
||||
else g.DrawRect(rect, Color.White);
|
||||
|
||||
var PXName = motAxisY == 2 ? arMotPosNameLM : arMotPosNameRM;
|
||||
g.DrawString(PXName, this.arFont_MotPosName, Brushes.Black, rect, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center, FormatFlags = StringFormatFlags.DirectionVertical });
|
||||
|
||||
var RPosY = this.arMotorPosition[motAxisY];
|
||||
var RPosZ = this.arMotorPosition[motAxisZ];
|
||||
//RPosY = 0;
|
||||
//RPosZ = 300;
|
||||
|
||||
//모터의 실제 위치에 뭉치를 그린다.
|
||||
|
||||
var PosY = (float)(rect.Top + (rect.Height - (rect.Height * RPosY / RealLenY)));
|
||||
|
||||
//Y뭉치를 그린다
|
||||
var rectYP = new RectangleF(rect.X - 1, PosY - (rect.Width / 2.0f), rect.Width + 2, rect.Width);
|
||||
g.FillRectangle(Brushes.Yellow, rectYP);
|
||||
g.DrawRect(rectYP, Color.Black, 2);
|
||||
//g.DrawLine(Pens.Red, rect.X - 30, PosY, rect.Right + 130, PosY);
|
||||
|
||||
|
||||
//Z축을 그린다.
|
||||
RectangleF rectZ = RectangleF.Empty;
|
||||
var zwidth = 60;
|
||||
if (reverse) rectZ = new RectangleF(rect.X - zwidth, PosY - 10, zwidth, 20);
|
||||
else rectZ = new RectangleF(rect.Right, PosY - 10, zwidth, 20);
|
||||
|
||||
float PosZ = 0f;
|
||||
if (reverse) PosZ = (float)(rectZ.Left + rectZ.Width - (rectZ.Width * RPosZ / RealLenZ));
|
||||
else PosZ = (float)(rectZ.Left + rectZ.Width * RPosZ / RealLenZ);
|
||||
|
||||
g.FillRectangle(Brushes.DimGray, rectZ);
|
||||
if (LockZ) g.DrawRect(rectZ, Color.Blue, 5);
|
||||
else g.DrawRect(rectZ, Color.White);
|
||||
|
||||
//z축 포지션 이름
|
||||
var ZposName = motAxisZ == 3 ? arMotPosNameLZ : arMotPosNameRZ;
|
||||
g.DrawString(ZposName, this.arFont_MotPosName, Brushes.Black, rectZ, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
||||
|
||||
//var CylStr = string.Format("FW:{0},BW:{1}", CylFW, CylBW);
|
||||
//if (CylFW == true && CylFW != CylBW) CylStr = "FW";
|
||||
//else if (CylBW == true && CylFW != CylBW) CylStr = "BW";
|
||||
//g.DrawString(CylStr, this.arFont_MotPosName, Brushes.Red, rectZ.Left, rectZ.Top - 20);
|
||||
|
||||
//Z뭉치를 그린다
|
||||
var rectZP = new RectangleF(PosZ - (rectZ.Height / 2.0f), rectZ.Y - 1, rectZ.Height, rectZ.Height + 2);
|
||||
if (ItemOn)
|
||||
{
|
||||
g.FillRectangle(Brushes.Lime, rectZP);
|
||||
g.DrawRect(rectZP, Color.Black, 2);
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
g.FillRectangle(Brushes.SkyBlue, rectZP);
|
||||
g.DrawRect(rectZP, Color.Black, 2);
|
||||
}
|
||||
using (Font f = new Font("Consolas", 10, FontStyle.Bold))
|
||||
g.DrawString((ItemPickOK ? "O" : "X"), f, Brushes.Black, rectZP, new StringFormat
|
||||
{
|
||||
Alignment = StringAlignment.Center,
|
||||
LineAlignment = StringAlignment.Center
|
||||
});
|
||||
|
||||
//g.DrawLine(Pens.Blue, PosZ, rectZ.Top - 30, PosZ, rectZ.Bottom + 100);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
237
Handler/Sub/UIControl/Loader/Draw_PickerY.cs
Normal file
237
Handler/Sub/UIControl/Loader/Draw_PickerY.cs
Normal file
@@ -0,0 +1,237 @@
|
||||
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);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user