From 5e14907f1c8669d49671c6b9374090c9584aea8f Mon Sep 17 00:00:00 2001 From: backuppc Date: Thu, 30 Oct 2025 17:32:13 +0900 Subject: [PATCH] feat: Add configurable Padding and display nodes without RFID in gray MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MapNode.cs: - Padding 속성 추가 (기본값 8px, 텍스트 주변 여백) - Clone 메서드에 Padding 복사 추가 NodePropertyWrapper.cs: - LabelNodePropertyWrapper에 Padding 속성 추가 - PropertyGrid에서 0~50px 범위로 조정 가능 UnifiedAGVCanvas.Events.cs: - DrawLabelNode: 하드코딩된 패딩을 node.Padding 사용 - GetNodeBrush: RFID 없는 노드를 회색 계통으로 표시 * Normal: Blue → LightGray * Rotation: Orange → DarkGray * Docking: Green → Gray * Charging: Red → Silver UnifiedAGVCanvas.Mouse.cs: - HandleLabelNodeDoubleClick: node.Name → node.LabelText 사용 이제 라벨 노드 패딩을 속성창에서 조정 가능하고, RFID 미할당 노드를 시각적으로 쉽게 구분 가능 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../Controls/ImageEditorCanvas.cs | 2 + .../AGVMapEditor/Forms/ImageEditorForm.cs | 5 +++ .../Models/NodePropertyWrapper.cs | 13 ++++++ .../Controls/UnifiedAGVCanvas.Events.cs | 39 +++++++++------- .../Controls/UnifiedAGVCanvas.Mouse.cs | 4 +- .../AGVNavigationCore/Models/MapNode.cs | 6 +++ Cs_HMI/Data/NewMap.agvmap | 45 ++++++++++++++++--- 7 files changed, 89 insertions(+), 25 deletions(-) diff --git a/Cs_HMI/AGVLogic/AGVMapEditor/Controls/ImageEditorCanvas.cs b/Cs_HMI/AGVLogic/AGVMapEditor/Controls/ImageEditorCanvas.cs index ad153f8..d469179 100644 --- a/Cs_HMI/AGVLogic/AGVMapEditor/Controls/ImageEditorCanvas.cs +++ b/Cs_HMI/AGVLogic/AGVMapEditor/Controls/ImageEditorCanvas.cs @@ -45,6 +45,8 @@ namespace AGVMapEditor.Controls this.DoubleBuffered = true; this.BackColor = Color.White; this.AutoScroll = true; + + } #region Properties diff --git a/Cs_HMI/AGVLogic/AGVMapEditor/Forms/ImageEditorForm.cs b/Cs_HMI/AGVLogic/AGVMapEditor/Forms/ImageEditorForm.cs index 74272cc..fca92fb 100644 --- a/Cs_HMI/AGVLogic/AGVMapEditor/Forms/ImageEditorForm.cs +++ b/Cs_HMI/AGVLogic/AGVMapEditor/Forms/ImageEditorForm.cs @@ -25,6 +25,11 @@ namespace AGVMapEditor.Forms { LoadImageFromNode(imageNode); } + + this.KeyPreview = true; + this.KeyDown += (s1, e1) => { + if (e1.KeyCode == Keys.Escape) this.Close(); + }; } private void SetupUI() diff --git a/Cs_HMI/AGVLogic/AGVMapEditor/Models/NodePropertyWrapper.cs b/Cs_HMI/AGVLogic/AGVMapEditor/Models/NodePropertyWrapper.cs index f52b300..412b0ed 100644 --- a/Cs_HMI/AGVLogic/AGVMapEditor/Models/NodePropertyWrapper.cs +++ b/Cs_HMI/AGVLogic/AGVMapEditor/Models/NodePropertyWrapper.cs @@ -154,6 +154,19 @@ namespace AGVMapEditor.Models } } + [Category("라벨")] + [DisplayName("패딩")] + [Description("텍스트 주변 여백 (픽셀 단위)")] + public int Padding + { + get => _node.Padding; + set + { + _node.Padding = Math.Max(0, Math.Min(50, value)); + _node.ModifiedDate = DateTime.Now; + } + } + [Category("위치")] [DisplayName("X 좌표")] [Description("맵에서의 X 좌표")] diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Events.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Events.cs index 6b3290b..5a0e4fd 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Events.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Events.cs @@ -743,10 +743,10 @@ namespace AGVNavigationCore.Controls { var backgroundBrush = new SolidBrush(node.BackColor); var backgroundRect = new Rectangle( - textPoint.X - 2, - textPoint.Y - 2, - (int)textSize.Width + 4, - (int)textSize.Height + 4 + textPoint.X - node.Padding, + textPoint.Y - node.Padding, + (int)textSize.Width + (node.Padding * 2), + (int)textSize.Height + (node.Padding * 2) ); g.FillRectangle(backgroundBrush, backgroundRect); g.DrawRectangle(Pens.Black, backgroundRect); @@ -759,11 +759,12 @@ namespace AGVNavigationCore.Controls // 선택된 노드 강조 if (node == _selectedNode) { + var selectionPadding = node.Padding + 2; var selectionRect = new Rectangle( - textPoint.X - 4, - textPoint.Y - 4, - (int)textSize.Width + 8, - (int)textSize.Height + 8 + textPoint.X - selectionPadding, + textPoint.Y - selectionPadding, + (int)textSize.Width + (selectionPadding * 2), + (int)textSize.Height + (selectionPadding * 2) ); g.DrawRectangle(_selectedNodePen, selectionRect); } @@ -771,11 +772,12 @@ namespace AGVNavigationCore.Controls // 호버된 노드 강조 if (node == _hoveredNode) { + var hoverPadding = node.Padding + 4; var hoverRect = new Rectangle( - textPoint.X - 6, - textPoint.Y - 6, - (int)textSize.Width + 12, - (int)textSize.Height + 12 + textPoint.X - hoverPadding, + textPoint.Y - hoverPadding, + (int)textSize.Width + (hoverPadding * 2), + (int)textSize.Height + (hoverPadding * 2) ); g.DrawRectangle(new Pen(Color.Orange, 2), hoverRect); } @@ -908,22 +910,25 @@ namespace AGVNavigationCore.Controls private Brush GetNodeBrush(MapNode node) { + // RFID가 없는 노드는 회색 계통으로 표시 + bool hasRfid = node.HasRfid(); + switch (node.Type) { case NodeType.Normal: - return _normalNodeBrush; + return hasRfid ? _normalNodeBrush : new SolidBrush(Color.LightGray); case NodeType.Rotation: - return _rotationNodeBrush; + return hasRfid ? _rotationNodeBrush : new SolidBrush(Color.DarkGray); case NodeType.Docking: - return _dockingNodeBrush; + return hasRfid ? _dockingNodeBrush : new SolidBrush(Color.Gray); case NodeType.Charging: - return _chargingNodeBrush; + return hasRfid ? _chargingNodeBrush : new SolidBrush(Color.Silver); case NodeType.Label: return new SolidBrush(Color.Purple); case NodeType.Image: return new SolidBrush(Color.Brown); default: - return _normalNodeBrush; + return hasRfid ? _normalNodeBrush : new SolidBrush(Color.LightGray); } } diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs index e79563c..efb0df7 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs @@ -105,7 +105,7 @@ namespace AGVNavigationCore.Controls private void HandleLabelNodeDoubleClick(MapNode node) { // 라벨 텍스트 입력창 표시 - string currentText = node.Name ?? "새 라벨"; + string currentText = node.LabelText ?? "새 라벨"; string newText = Microsoft.VisualBasic.Interaction.InputBox( "라벨 텍스트를 입력하세요:", "라벨 편집", @@ -113,7 +113,7 @@ namespace AGVNavigationCore.Controls if (!string.IsNullOrWhiteSpace(newText) && newText != currentText) { - node.Name = newText.Trim(); + node.LabelText = newText.Trim(); MapChanged?.Invoke(this, EventArgs.Empty); Invalidate(); } diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapNode.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapNode.cs index 64e2600..4d26d06 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapNode.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapNode.cs @@ -138,6 +138,11 @@ namespace AGVNavigationCore.Models /// public bool ShowBackground { get; set; } = false; + /// + /// 라벨 패딩 (NodeType.Label인 경우 사용, 픽셀 단위) + /// + public int Padding { get; set; } = 8; + /// /// 이미지 파일 경로 (편집용, 저장시엔 사용되지 않음) /// @@ -343,6 +348,7 @@ namespace AGVNavigationCore.Models ForeColor = ForeColor, BackColor = BackColor, ShowBackground = ShowBackground, + Padding = Padding, ImagePath = ImagePath, ImageBase64 = ImageBase64, Scale = Scale, diff --git a/Cs_HMI/Data/NewMap.agvmap b/Cs_HMI/Data/NewMap.agvmap index 1ca0c86..06febbe 100644 --- a/Cs_HMI/Data/NewMap.agvmap +++ b/Cs_HMI/Data/NewMap.agvmap @@ -26,6 +26,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -59,6 +60,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -92,6 +94,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -127,6 +130,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -160,6 +164,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -193,6 +198,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -226,6 +232,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -259,6 +266,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -291,6 +299,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -325,6 +334,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -358,6 +368,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -391,6 +402,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -423,6 +435,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -455,6 +468,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -489,6 +503,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -522,6 +537,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -555,6 +571,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -588,6 +605,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -620,6 +638,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -629,7 +648,7 @@ { "NodeId": "LBL001", "Name": "Amkor Technology Korea", - "Position": "58, 64", + "Position": "102, 42", "Type": 4, "DockDirection": 0, "ConnectedNodes": [], @@ -637,7 +656,7 @@ "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T11:08:22.4048927+09:00", - "ModifiedDate": "2025-09-15T11:22:15.1196535+09:00", + "ModifiedDate": "2025-10-30T17:14:35.0184087+09:00", "IsActive": true, "DisplayColor": "Purple", "RfidId": "", @@ -645,11 +664,12 @@ "RfidDescription": "", "LabelText": "Amkor Technology Korea", "FontFamily": "Arial", - "FontSize": 12.0, + "FontSize": 20.0, "FontStyle": 0, - "ForeColor": "Black", - "BackColor": "255, 255, 192", + "ForeColor": "White", + "BackColor": "DarkSlateGray", "ShowBackground": true, + "Padding": 5, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -680,6 +700,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "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", "Scale": "0.7, 0.7", "Opacity": 1.0, @@ -713,6 +734,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -746,6 +768,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -779,6 +802,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -813,6 +837,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -847,6 +872,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -881,6 +907,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -914,6 +941,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -946,6 +974,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -978,6 +1007,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -1010,6 +1040,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -1042,6 +1073,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -1075,6 +1107,7 @@ "ForeColor": "Black", "BackColor": "Transparent", "ShowBackground": false, + "Padding": 0, "ImageBase64": "", "Scale": "1, 1", "Opacity": 1.0, @@ -1082,6 +1115,6 @@ "DisplayText": "N031 - [030]" } ], - "CreatedDate": "2025-10-30T09:37:03.9172219+09:00", + "CreatedDate": "2025-10-30T17:14:37.0561243+09:00", "Version": "1.0" } \ No newline at end of file