프로젝트 구조 개선 및 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:
482
Handler/Sub/UIControl/CPort.cs
Normal file
482
Handler/Sub/UIControl/CPort.cs
Normal file
@@ -0,0 +1,482 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace UIControl
|
||||
{
|
||||
public class CPort
|
||||
{
|
||||
public Boolean SaftyErr { get; set; }
|
||||
//public Boolean Safty2Err { get; set; }
|
||||
// public Boolean SaftyErr { get { return Safty1Err || Safty2Err; } }
|
||||
public Boolean MotorRun { get; set; }
|
||||
public Boolean MotorDir { get; set; }
|
||||
public int arrowIndex { get; set; }
|
||||
public Boolean LimitUpper { get; set; }
|
||||
public Boolean LimitLower { get; set; }
|
||||
public Boolean OverLoad
|
||||
{
|
||||
get
|
||||
{
|
||||
return LimitLower && DetectUp;
|
||||
}
|
||||
}
|
||||
public byte AlignOK { get; set; }
|
||||
public void AlignReset() { AlignOK = 0; errorCount = 0; }
|
||||
public Boolean Ready { get; set; }
|
||||
|
||||
public Boolean DetectUp { get; set; } //상단에 있는 자재 감지 센서
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 7인치 13인치의 크기 정보를 표시한다
|
||||
/// </summary>
|
||||
public string title { get; set; }
|
||||
public int reelNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 차수별 릴 작업 수량이 표시됨
|
||||
/// </summary>
|
||||
public int reelCount { get; set; }
|
||||
|
||||
public int errorCount { get; set; }
|
||||
public int CartSize { get; set; }
|
||||
|
||||
|
||||
|
||||
public System.Drawing.Color bgColor { get; set; }
|
||||
private Boolean _enable = false;
|
||||
|
||||
public Color fgColor { get; set; }
|
||||
public Color fgColorCount { get; set; }
|
||||
|
||||
public Rectangle rect_title { get; set; }
|
||||
public RectangleF Rect { get; set; }
|
||||
public Rectangle rect_count { get; set; }
|
||||
public int AnimationStepPort { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 0:notcart , 1:ready, 2:full
|
||||
/// </summary>
|
||||
public ushort State { get; set; }
|
||||
|
||||
public Boolean Enable
|
||||
{
|
||||
get { return _enable; }
|
||||
set
|
||||
{
|
||||
_enable = value;
|
||||
this.bgColor = value ? Color.Lime : Color.FromArgb(43, 43, 43);
|
||||
this.fgColor = value ? Color.White : Color.DimGray;
|
||||
}
|
||||
}
|
||||
|
||||
public CPort()
|
||||
{
|
||||
CartSize = 0;
|
||||
Ready = false;
|
||||
Enable = false;
|
||||
rect_title = Rectangle.Empty;
|
||||
rect_count = Rectangle.Empty;
|
||||
Rect = RectangleF.Empty;
|
||||
reelNo = -1;
|
||||
arrowIndex = 2;
|
||||
reelCount = 0;
|
||||
fgColor = Color.Black;
|
||||
Clear();
|
||||
AlignOK = 0;
|
||||
AnimationStepPort = 9;
|
||||
//Items.Clear();
|
||||
}
|
||||
//public void ClearItem()
|
||||
//{
|
||||
// Items.Clear();
|
||||
//}
|
||||
public void Clear()
|
||||
{
|
||||
CartSize = 0;
|
||||
Enable = true;
|
||||
SaftyErr = false;
|
||||
MotorRun = false;
|
||||
MotorDir = false;
|
||||
LimitUpper = false;
|
||||
LimitLower = false;
|
||||
reelNo = 0;
|
||||
reelCount = 0;
|
||||
DetectUp = false;
|
||||
}
|
||||
|
||||
public void Display(Graphics g, Font fCnt, Font fMsg, Boolean Magneton, Boolean VisionRdy, Boolean VisionEnd, Boolean ItemOn, Boolean VisionLock, int VisionCnt)
|
||||
{
|
||||
if (Enable == false)
|
||||
{
|
||||
g.DrawLine(Pens.DimGray, Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
|
||||
g.DrawLine(Pens.DimGray, Rect.Right, Rect.Top, Rect.Left, Rect.Bottom);
|
||||
}
|
||||
|
||||
//모터사용시 화살표
|
||||
eDirection DirL = MotorDir == false ? eDirection.TopToBottom : eDirection.BottomToTop;
|
||||
if (MotorRun) UIControl.Common.Draw_Arrow(g, Rect, DirL, arrowIndex, AnimationStepPort, Color.Gold, fMsg);
|
||||
|
||||
//글자표시 (크기 및 작업 수량)
|
||||
var sf = new StringFormat
|
||||
{
|
||||
Alignment = StringAlignment.Center,
|
||||
LineAlignment = StringAlignment.Center,
|
||||
};
|
||||
|
||||
|
||||
//리밋영역표시(상/하)
|
||||
var limitSizeH = (int)(Rect.Height * 0.2);
|
||||
|
||||
|
||||
if (OverLoad == true)//과적
|
||||
{
|
||||
g.FillRectangle(Brushes.Red, Rect);
|
||||
g.DrawString("OVER\nLOAD", fMsg, new SolidBrush(fgColor), Rect, sf);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (errorCount > 5)
|
||||
{
|
||||
g.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.Gold)), Rect);
|
||||
}
|
||||
else
|
||||
{
|
||||
g.FillRectangle(new SolidBrush(Color.FromArgb(150, Color.Black)), Rect);
|
||||
}
|
||||
|
||||
|
||||
if (errorCount > 0)
|
||||
{
|
||||
if (errorCount > 05)
|
||||
{
|
||||
g.DrawString(reelCount.ToString() + "\n(ERROR)", fCnt, new SolidBrush(Color.Red), Rect, sf);
|
||||
}
|
||||
else g.DrawString(reelCount.ToString() + "\nE:" + errorCount.ToString(), fCnt, new SolidBrush(Color.Red), Rect, sf);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
g.DrawString(reelCount.ToString(), fCnt, new SolidBrush(fgColor), Rect, sf);
|
||||
}
|
||||
}
|
||||
|
||||
//마그넷상태표시
|
||||
var magheight = 30;
|
||||
var magrect = new RectangleF(this.Rect.Left, this.Rect.Bottom - magheight, this.Rect.Width, magheight);
|
||||
if (Magneton)
|
||||
{
|
||||
g.DrawString("LOCK(" + CartSize.ToString() + ")", new Font("Consolas", 10, FontStyle.Bold), Brushes.Gold, magrect, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
||||
}
|
||||
else
|
||||
{
|
||||
g.FillRectangle(Brushes.DimGray, magrect);
|
||||
g.DrawString("UNLOCK(" + CartSize.ToString() + ")", new Font("Consolas", 10, FontStyle.Bold), Brushes.Black, magrect, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
||||
}
|
||||
|
||||
//아이템을 가지고 있다면 처리해준다.
|
||||
if (ItemOn)
|
||||
{
|
||||
magrect = new RectangleF(this.Rect.Left, this.Rect.Top, this.Rect.Width, magheight);
|
||||
g.FillRectangle(Brushes.Gold, magrect);
|
||||
g.DrawString("ITEM-ON", new Font("Consolas", 12, FontStyle.Bold), Brushes.Black, magrect, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
||||
}
|
||||
|
||||
|
||||
|
||||
//데두리표시 ( 비활성 회색, 활성 감지 : 라임, 미감지 흰색)
|
||||
Color borderL = Enable ? (LimitUpper ? Color.Red : (LimitLower ? Color.Blue : (DetectUp ? Color.Lime : Color.White))) : Color.DimGray;
|
||||
if (OverLoad) borderL = Color.White;
|
||||
int bordersize = 7;//ortL.enable ? 7 : 1;
|
||||
|
||||
//비젼영역추가 201228
|
||||
using (Font f = new Font("Consolas", 8, FontStyle.Bold))
|
||||
{
|
||||
var vrect = new RectangleF(Rect.Right, Rect.Top, 20, Rect.Height);
|
||||
Color fcolor2 = Color.Gray;
|
||||
var drawstr = "VISON RDY";
|
||||
if (VisionEnd) { drawstr = "VISION END"; fcolor2 = Color.Lime; }
|
||||
else if (VisionRdy) { drawstr = "VISION RUN"; fcolor2 = Color.Gold; };
|
||||
drawstr += "(" + VisionCnt.ToString() + ")";
|
||||
if (VisionLock) g.DrawRect(vrect, Color.Blue, 7);
|
||||
else g.DrawRect(vrect, fcolor2, 7);
|
||||
g.DrawString(drawstr, f, new SolidBrush(fcolor2), vrect, new StringFormat
|
||||
{
|
||||
Alignment = StringAlignment.Center,
|
||||
LineAlignment = StringAlignment.Center,
|
||||
FormatFlags = StringFormatFlags.DirectionVertical
|
||||
});
|
||||
|
||||
vrect = new RectangleF(Rect.Left - 20, Rect.Top, 20, Rect.Height);
|
||||
fcolor2 = Color.Gray;
|
||||
drawstr = "PORT RDY(" + this.AlignOK.ToString() + ")";
|
||||
if (Ready) fcolor2 = Color.Lime;
|
||||
g.DrawRect(vrect, fcolor2, 7);
|
||||
g.DrawString(drawstr, f, new SolidBrush(fcolor2), vrect, new StringFormat
|
||||
{
|
||||
Alignment = StringAlignment.Center,
|
||||
LineAlignment = StringAlignment.Center,
|
||||
FormatFlags = StringFormatFlags.DirectionVertical
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
if (OverLoad == false)
|
||||
{
|
||||
var fontsize = 9;
|
||||
using (Font fnt = new Font("Consolas", fontsize, FontStyle.Bold))
|
||||
{
|
||||
//상단 리밋은 상단에
|
||||
if (LimitUpper)
|
||||
{
|
||||
var msgLU = "+ LIMIT";
|
||||
var fsize = g.MeasureString(msgLU, fnt);
|
||||
var msgW = fsize.Width * 1.5f;
|
||||
var msgH = fsize.Height * 1.5f;
|
||||
if (msgW > this.Rect.Width * 0.70f) msgW = this.Rect.Width * 0.7f;
|
||||
|
||||
var RectMsgL = new RectangleF(
|
||||
Rect.Left + (Rect.Width - msgW) / 2.0f,
|
||||
Rect.Top - msgH - bordersize / 2.0f + 1,
|
||||
msgW, msgH);
|
||||
|
||||
g.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.Red)), RectMsgL);
|
||||
// g.DrawRectangle(Pens.Black, RectMsgL);
|
||||
g.DrawString(msgLU, fnt, Color.White, RectMsgL);
|
||||
|
||||
}
|
||||
|
||||
//아이템 감지신호는 상단 아래쪽으로
|
||||
if (Ready)
|
||||
{
|
||||
//var msgLU = "READY";
|
||||
//var fsize = g.MeasureString(msgLU, fnt);
|
||||
//var msgW = fsize.Width * 1.5f;
|
||||
//var msgH = fsize.Height * 1.5f;
|
||||
//if (msgW > this.Rect.Width * 0.70f) msgW = this.Rect.Width * 0.7f;
|
||||
|
||||
//var RectMsgL = new RectangleF(
|
||||
//Rect.Left + (Rect.Width - msgW) / 2.0f,
|
||||
//Rect.Top + bordersize / 2.0f - 1,
|
||||
//msgW, msgH);
|
||||
|
||||
//g.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.Lime)), RectMsgL);
|
||||
//// g.DrawRectangle(Pens.Black, RectMsgL);
|
||||
//g.DrawString(msgLU, fnt, Color.Black, RectMsgL);
|
||||
}
|
||||
|
||||
|
||||
//하단 리밋은 하단에표시
|
||||
if (LimitLower)
|
||||
{
|
||||
var msgLU = "- LIMIT";
|
||||
var fsize = g.MeasureString(msgLU, fnt);
|
||||
var msgW = fsize.Width * 1.5f;
|
||||
var msgH = fsize.Height * 1.5f;
|
||||
if (msgW > this.Rect.Width * 0.70f) msgW = this.Rect.Width * 0.7f;
|
||||
|
||||
var RectMsgL = new RectangleF(
|
||||
Rect.Left + (Rect.Width - msgW) / 2.0f,
|
||||
Rect.Top - msgH - bordersize / 2.0f + 1,
|
||||
msgW, msgH);
|
||||
|
||||
g.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.Blue)), RectMsgL);
|
||||
//g.DrawString(msgLU, fnt, Brushes.White, RectMsgL, sf);
|
||||
g.DrawString(msgLU, fnt, Color.White, RectMsgL);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//아이템 감지
|
||||
if (DetectUp)
|
||||
{
|
||||
var msgLU = "DETECT";
|
||||
var fsize = g.MeasureString(msgLU, fnt);
|
||||
var msgW = fsize.Width * 1.5f;
|
||||
var msgH = fsize.Height * 1.5f;
|
||||
if (msgW > this.Rect.Width * 0.70f) msgW = this.Rect.Width * 0.7f;
|
||||
|
||||
var RectMsgL = new RectangleF(
|
||||
Rect.Left + (Rect.Width - msgW) / 2.0f,
|
||||
Rect.Bottom + 1,
|
||||
msgW, msgH);
|
||||
|
||||
g.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.Lime)), RectMsgL);
|
||||
//g.DrawRectangle(Pens.Black, RectMsgL);
|
||||
g.DrawString(msgLU, fnt, Color.Black, RectMsgL);
|
||||
|
||||
}
|
||||
|
||||
//안전 오류는 중앙에
|
||||
|
||||
if (SaftyErr)
|
||||
{
|
||||
var msgS = "SAFTY ERROR";
|
||||
var fsize = g.MeasureString(msgS, fMsg);
|
||||
var msgW = fsize.Width * 1.5f;
|
||||
var msgH = fsize.Height * 1.5f;
|
||||
if (msgW > this.Rect.Width * 0.80f) msgW = this.Rect.Width * 0.8f;
|
||||
|
||||
var RectMsgL = new RectangleF(
|
||||
Rect.Left + (Rect.Width - msgW) / 2.0f,
|
||||
Rect.Top + (Rect.Height - msgH) / 2.0f,
|
||||
msgW, msgH);
|
||||
|
||||
g.FillRectangle(new SolidBrush(Color.FromArgb(240, Color.Khaki)), RectMsgL);
|
||||
g.DrawRectangle(Pens.Black, RectMsgL);
|
||||
g.DrawString(msgS, fMsg, Color.Maroon, RectMsgL);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//테두리가 리밋영역을 감추도록 그린다
|
||||
g.DrawRectangle(new Pen(borderL, bordersize), Rect.Left, Rect.Top, Rect.Width, Rect.Height);
|
||||
|
||||
|
||||
|
||||
|
||||
sf.Dispose();
|
||||
}
|
||||
|
||||
public void DisplayConv(Graphics g, Font fCnt, Font fMsg, Boolean Magneton, Boolean VisionRdy, Boolean VisionEnd, Boolean ItemOn, Boolean VisionLock, int VisionCnt, bool cvbusy, bool cvreadyoff)
|
||||
{
|
||||
if (Enable == false)
|
||||
{
|
||||
g.DrawLine(Pens.DimGray, Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
|
||||
g.DrawLine(Pens.DimGray, Rect.Right, Rect.Top, Rect.Left, Rect.Bottom);
|
||||
}
|
||||
|
||||
|
||||
//모터사용시 화살표
|
||||
eDirection DirL = MotorDir == false ? eDirection.TopToBottom : eDirection.BottomToTop;
|
||||
if (MotorRun) UIControl.Common.Draw_Arrow(g, Rect, DirL, arrowIndex, AnimationStepPort, Color.Gold, fMsg);
|
||||
|
||||
//글자표시 (크기 및 작업 수량)
|
||||
var sf = new StringFormat
|
||||
{
|
||||
Alignment = StringAlignment.Center,
|
||||
LineAlignment = StringAlignment.Center,
|
||||
};
|
||||
|
||||
|
||||
//리밋영역표시(상/하)
|
||||
var limitSizeH = (int)(Rect.Height * 0.2);
|
||||
|
||||
|
||||
if (errorCount > 5)
|
||||
{
|
||||
g.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.Gold)), Rect);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cvbusy)
|
||||
g.FillRectangle(new SolidBrush(Color.FromArgb(150, Color.Tomato)), Rect);
|
||||
if (cvreadyoff)
|
||||
g.FillRectangle(new SolidBrush(Color.FromArgb(150, Color.Red)), Rect);
|
||||
else
|
||||
g.FillRectangle(new SolidBrush(Color.FromArgb(150, Color.Black)), Rect);
|
||||
}
|
||||
|
||||
if (reelCount != 0)
|
||||
{
|
||||
//버튼형태처럼 보이게한다.
|
||||
g.FillRectangle(new SolidBrush(Color.FromArgb(100, Color.Gold)), Rect);
|
||||
g.DrawRectangle(new Pen(Color.WhiteSmoke, 5), Rect.Left, Rect.Top, Rect.Width, Rect.Height);
|
||||
}
|
||||
|
||||
if (errorCount > 0)
|
||||
{
|
||||
if (errorCount > 05)
|
||||
{
|
||||
g.DrawString(reelCount.ToString() + "\n(ERROR)", fCnt, new SolidBrush(Color.Red), Rect, sf);
|
||||
}
|
||||
else g.DrawString(reelCount.ToString() + "\nE:" + errorCount.ToString(), fCnt, new SolidBrush(Color.Red), Rect, sf);
|
||||
}
|
||||
else if (reelCount > 0)
|
||||
{
|
||||
|
||||
g.DrawString(reelCount.ToString(), fCnt, new SolidBrush(fgColor), Rect, sf);
|
||||
}
|
||||
|
||||
//마그넷상태표시
|
||||
var magheight = 30;
|
||||
var magrect = new RectangleF(this.Rect.Left, this.Rect.Bottom - magheight, this.Rect.Width, magheight);
|
||||
//if (Magneton)
|
||||
//{
|
||||
// g.DrawString("LOCK(" + CartSize.ToString() + ")", new Font("Consolas", 10, FontStyle.Bold), Brushes.Gold, magrect, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// g.FillRectangle(Brushes.DimGray, magrect);
|
||||
// g.DrawString("UNLOCK(" + CartSize.ToString() + ")", new Font("Consolas", 10, FontStyle.Bold), Brushes.Black, magrect, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
||||
//}
|
||||
|
||||
//아이템을 가지고 있다면 처리해준다.
|
||||
if (ItemOn)
|
||||
{
|
||||
magrect = new RectangleF(this.Rect.Left, this.Rect.Top, this.Rect.Width, magheight);
|
||||
g.FillRectangle(Brushes.Gold, magrect);
|
||||
g.DrawString("ITEM-ON", new Font("Consolas", 12, FontStyle.Bold), Brushes.Black, magrect, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
||||
}
|
||||
|
||||
|
||||
|
||||
//데두리표시 ( 비활성 회색, 활성 감지 : 라임, 미감지 흰색)
|
||||
Color borderL = Enable ? Color.White : Color.DimGray;
|
||||
//if (OverLoad) borderL = Color.White;
|
||||
int bordersize = 7;//ortL.enable ? 7 : 1;
|
||||
|
||||
//비젼영역추가 201228
|
||||
using (Font f = new Font("Consolas", 8, FontStyle.Bold))
|
||||
{
|
||||
var vrect = new RectangleF(Rect.Right, Rect.Top, 20, Rect.Height);
|
||||
Color fcolor2 = Color.Gray;
|
||||
var drawstr = "VISON RDY";
|
||||
if (VisionEnd) { drawstr = "VISION END"; fcolor2 = Color.Lime; }
|
||||
else if (VisionRdy) { drawstr = "VISION RUN"; fcolor2 = Color.Gold; };
|
||||
drawstr += "(" + VisionCnt.ToString() + ")";
|
||||
if (VisionLock) g.DrawRect(vrect, Color.Blue, 7);
|
||||
else g.DrawRect(vrect, fcolor2, 7);
|
||||
g.DrawString(drawstr, f, new SolidBrush(fcolor2), vrect, new StringFormat
|
||||
{
|
||||
Alignment = StringAlignment.Center,
|
||||
LineAlignment = StringAlignment.Center,
|
||||
FormatFlags = StringFormatFlags.DirectionVertical
|
||||
});
|
||||
|
||||
vrect = new RectangleF(Rect.Left - 20, Rect.Top, 20, Rect.Height);
|
||||
fcolor2 = Color.Gray;
|
||||
drawstr = "EXT RDY";
|
||||
if (cvreadyoff) fcolor2 = Color.Red;
|
||||
else if (Ready) fcolor2 = Color.Lime;
|
||||
g.DrawRect(vrect, fcolor2, 7);
|
||||
g.DrawString(drawstr, f, new SolidBrush(fcolor2), vrect, new StringFormat
|
||||
{
|
||||
Alignment = StringAlignment.Center,
|
||||
LineAlignment = StringAlignment.Center,
|
||||
FormatFlags = StringFormatFlags.DirectionVertical
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//테두리가 리밋영역을 감추도록 그린다
|
||||
if (reelCount == 0)
|
||||
{
|
||||
g.DrawRectangle(new Pen(borderL, bordersize), Rect.Left, Rect.Top, Rect.Width, Rect.Height);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
sf.Dispose();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user