..
This commit is contained in:
@@ -72,6 +72,9 @@ namespace AGVNavigationCore.Controls
|
||||
DrawDragGhost(g);
|
||||
}
|
||||
|
||||
// 마그넷 방향 텍스트 그리기 (노드 위에 표시)
|
||||
DrawMagnetDirections(g);
|
||||
|
||||
// AGV 그리기
|
||||
DrawAGVs(g);
|
||||
|
||||
@@ -105,6 +108,105 @@ namespace AGVNavigationCore.Controls
|
||||
|
||||
}
|
||||
|
||||
private void DrawMagnetDirections(Graphics g)
|
||||
{
|
||||
if (_nodes == null) return;
|
||||
|
||||
using (var font = new Font("Arial", 8, FontStyle.Bold))
|
||||
using (var brushS = new SolidBrush(Color.Magenta))
|
||||
using (var brushL = new SolidBrush(Color.Green))
|
||||
using (var brushR = new SolidBrush(Color.Blue))
|
||||
using (var brushBg = new SolidBrush(Color.FromArgb(180, 255, 255, 255)))
|
||||
{
|
||||
foreach (var node in _nodes)
|
||||
{
|
||||
if (node.MagnetDirections != null && node.MagnetDirections.Count > 0)
|
||||
{
|
||||
foreach (var kvp in node.MagnetDirections)
|
||||
{
|
||||
var targetId = kvp.Key;
|
||||
var dir = kvp.Value;
|
||||
var targetNode = _nodes.FirstOrDefault(n => n.Id == targetId);
|
||||
|
||||
if (targetNode != null)
|
||||
{
|
||||
// 방향 텍스트 위치 계산 (출발 -> 도착 벡터의 일정 거리 지점)
|
||||
var start = node.Position;
|
||||
var end = targetNode.Position;
|
||||
var angle = Math.Atan2(end.Y - start.Y, end.X - start.X);
|
||||
|
||||
// 박스(텍스트) 중심 위치: 약 40px 거리
|
||||
var boxDist = 40;
|
||||
var boxX = start.X + boxDist * Math.Cos(angle);
|
||||
var boxY = start.Y + boxDist * Math.Sin(angle);
|
||||
|
||||
string text = dir.ToString();
|
||||
|
||||
Color color = Color.Blue;
|
||||
if (dir == MagnetPosition.L) color = Color.LimeGreen;
|
||||
else if (dir == MagnetPosition.R) color = Color.Red;
|
||||
|
||||
// 화살표 및 텍스트 설정
|
||||
using (var arrowBrush = new SolidBrush(color))
|
||||
using (var arrowPen = new Pen(color, 2)) // 두께 약간 증가
|
||||
using (var textBrush = new SolidBrush(color))
|
||||
{
|
||||
// 1. 화살표 그리기 (박스를 가로지르는 선)
|
||||
// 시작점: 노드 근처 (25px)
|
||||
// 끝점: 박스 너머 (55px)
|
||||
var arrowStartDist = 25;
|
||||
var arrowEndDist = 55;
|
||||
|
||||
var pStart = new PointF((float)(start.X + arrowStartDist * Math.Cos(angle)), (float)(start.Y + arrowStartDist * Math.Sin(angle)));
|
||||
var pEnd = new PointF((float)(start.X + arrowEndDist * Math.Cos(angle)), (float)(start.Y + arrowEndDist * Math.Sin(angle)));
|
||||
|
||||
// 화살표 선 그리기
|
||||
g.DrawLine(arrowPen, pStart, pEnd);
|
||||
|
||||
// 화살표 머리 그리기 (끝점에)
|
||||
var arrowSize = 6;
|
||||
var pHead1 = new PointF((float)(pEnd.X + arrowSize * Math.Cos(angle)), (float)(pEnd.Y + arrowSize * Math.Sin(angle))); // 뾰족한 끝
|
||||
// 삼각형 머리 (채우기)
|
||||
var pBackL = new PointF((float)(pEnd.X + arrowSize * Math.Cos(angle + 2.5)), (float)(pEnd.Y + arrowSize * Math.Sin(angle + 2.5)));
|
||||
var pBackR = new PointF((float)(pEnd.X + arrowSize * Math.Cos(angle - 2.5)), (float)(pEnd.Y + arrowSize * Math.Sin(angle - 2.5)));
|
||||
|
||||
// pHead1이 가장 먼 쪽이 되도록 조정 (pEnd가 삼각형의 뒷부분 중심이 되도록)
|
||||
// pEnd에서 시작해서 앞으로 나가는 삼각형
|
||||
// pTip = pEnd + size * angle
|
||||
// pBackL = pEnd + size/2 * angle_back_L (약간 뒤로)
|
||||
// 현재 코드는 pEnd를 중심으로, pHead1이 앞, pBackL/R이 뒤... 가 아니라
|
||||
// pHead1, pBackK, pBackR로 삼각형을 그림.
|
||||
// pHead1이 팁.
|
||||
g.FillPolygon(arrowBrush, new PointF[] { pHead1, pBackL, pBackR });
|
||||
|
||||
// 2. 텍스트 그리기 (화살표 위에 박스, 그 위에 텍스트)
|
||||
var textSize = g.MeasureString(text, font);
|
||||
var textPoint = new PointF((float)(boxX - textSize.Width / 2), (float)(boxY - textSize.Height / 2));
|
||||
|
||||
//편집모드에서만 글자를 표시한다.
|
||||
if(Mode == CanvasMode.Edit)
|
||||
{
|
||||
// 텍스트 배경 (반투명 - 선이 은은하게 보이도록 투명도 조절하거나, 가독성을 위해 불투명하게 처리)
|
||||
// 사용자가 "박스를 가로지르는" 느낌을 원했으므로 선이 보여야 함. 하지만 텍스트 가독성도 필요.
|
||||
// 배경을 아주 옅게 (Alpha 100정도) 처리하여 선이 보이게 함.
|
||||
using (var translucentBg = new SolidBrush(Color.FromArgb(120, 255, 255, 255)))
|
||||
{
|
||||
g.FillRectangle(translucentBg, textPoint.X - 1, textPoint.Y - 1, textSize.Width + 2, textSize.Height + 2);
|
||||
}
|
||||
g.DrawString(text, font, textBrush, textPoint);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DrawAlertMessage(Graphics g)
|
||||
{
|
||||
if (showalert == false) return;
|
||||
|
||||
Reference in New Issue
Block a user