diff --git a/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.Designer.cs b/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.Designer.cs index 64f9397..9dddbeb 100644 --- a/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.Designer.cs +++ b/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.Designer.cs @@ -64,7 +64,6 @@ namespace AGVMapEditor.Forms this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this.btnSave = new System.Windows.Forms.ToolStripButton(); this.btnSaveAs = new System.Windows.Forms.ToolStripButton(); - this.testToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.statusStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); this.splitContainer1.Panel1.SuspendLayout(); @@ -255,8 +254,7 @@ namespace AGVMapEditor.Forms // this.btnAddNode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.btnAddLabel, - this.btnAddImage, - this.testToolStripMenuItem}); + this.btnAddImage}); this.btnAddNode.Image = ((System.Drawing.Image)(resources.GetObject("btnAddNode.Image"))); this.btnAddNode.ImageTransparentColor = System.Drawing.Color.Magenta; this.btnAddNode.Name = "btnAddNode"; @@ -419,13 +417,6 @@ namespace AGVMapEditor.Forms this.btnSaveAs.ToolTipText = "다른 이름으로 저장"; this.btnSaveAs.Click += new System.EventHandler(this.btnSaveAs_Click); // - // testToolStripMenuItem - // - this.testToolStripMenuItem.Name = "testToolStripMenuItem"; - this.testToolStripMenuItem.Size = new System.Drawing.Size(166, 22); - this.testToolStripMenuItem.Text = "test"; - this.testToolStripMenuItem.Click += new System.EventHandler(this.testToolStripMenuItem_Click); - // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); @@ -499,6 +490,5 @@ namespace AGVMapEditor.Forms private System.Windows.Forms.ToolStripButton btnAddImage; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.ToolStripMenuItem testToolStripMenuItem; } } \ No newline at end of file diff --git a/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.cs b/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.cs index 7c76c63..9a9aeee 100644 --- a/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.cs +++ b/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.cs @@ -114,6 +114,7 @@ namespace AGVMapEditor.Forms _mapCanvas.NodeMoved += OnNodeMoved; _mapCanvas.NodeDeleted += OnNodeDeleted; _mapCanvas.ConnectionDeleted += OnConnectionDeleted; + _mapCanvas.ImageNodeDoubleClicked += OnImageNodeDoubleClicked; _mapCanvas.MapChanged += OnMapChanged; // 스플리터 패널에 맵 캔버스 추가 @@ -218,6 +219,24 @@ namespace AGVMapEditor.Forms UpdateNodeProperties(); // 연결 정보 업데이트 } + private void OnImageNodeDoubleClicked(object sender, MapNode node) + { + // 이미지 노드 더블클릭 시 이미지 편집창 표시 + if (node != null && node.Type == NodeType.Image) + { + using (var editor = new ImageEditorForm(node)) + { + if (editor.ShowDialog(this) == DialogResult.OK) + { + _hasChanges = true; + UpdateTitle(); + _mapCanvas.Invalidate(); // 캔버스 다시 그리기 + UpdateNodeProperties(); // 속성 업데이트 + } + } + } + } + private void OnMapChanged(object sender, EventArgs e) { _hasChanges = true; @@ -1143,9 +1162,5 @@ namespace AGVMapEditor.Forms } } - private void testToolStripMenuItem_Click(object sender, EventArgs e) - { - _mapCanvas.CurrentEditMode = UnifiedAGVCanvas.EditMode.AddLabel; - } } } \ No newline at end of file diff --git a/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.resx b/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.resx index d1d15bc..5346a8d 100644 --- a/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.resx +++ b/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.resx @@ -120,28 +120,10 @@ 132, 17 - - 249, 17 - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIFSURBVDhPpZLtS1NhGMbPPxJmmlYSgqHiKzGU1EDxg4iK - YKyG2WBogqMYJQOtCEVRFBGdTBCJfRnkS4VaaWNT5sqx1BUxRXxDHYxAJLvkusEeBaPAB+5z4Jzn+t3X - /aLhnEfjo8m+dCoa+7/C3O2Hqe0zDC+8KG+cRZHZhdzaaWTVTCLDMIY0vfM04Nfh77/G/sEhwpEDbO3t - I7TxE8urEVy99fT/AL5gWDLrTB/hnF4XsW0khCu5ln8DmJliT2AXrcNBsU1gj/MH4nMeKwBrPktM28xM - cX79DFKrHHD5d9D26hvicx4pABt2lpg10zYzU0zr7+e3xXGcrkEB2O2TNec9nJFwB3alZn5jZorfeDZh - 6Q3g8s06BeCoKF4MRURoH1+BY2oNCbeb0TIclIYxOhzf8frTOuo7FxCbbVIAzpni0iceEc8vhzEwGkJD - lx83ymxifejdKjRNk/8PWnyIyTQqAJek0jqHwfEVscu31baIu8+90sTE4nY025dQ2/5FIPpnXlzKuK8A - HBUzHot52djqQ6HZhfR7IwK4mKpHtvEDMqvfCiQ6zaAAXM8x94aIWTNrLLG4kVUzgaTSPlzLtyJOZxbb - 1wtfyg4Q+AfA3aZlButjSfxGcUJBk4g5tuP3haQKRKXcUQDOmbvNTpPOJeFFjordZmbWTNvMTHFUcpUC - nOccAdABIDXXE1nzAAAAAElFTkSuQmCC - - 462, 17 + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 @@ -299,6 +281,27 @@ UaXercygfFZaPW6h2fEOOkaO5bFky+6bmasTbWfxp8lO/PXDIP625MQfJ1rxSOUx2ZUsJJnYK2mGqe4S HJ614ej7AbzC3cfzjyqwNUP1+eX5lO1Kf1I9q001eCz5eMndjBfdLXj6XhEeqTn8/anu4A6l958aNh8x OMtS8OvWLDxcqf7i1KfsUnr+q+Gqozv7Sw5ZHKa0bYm/v22YpTjaxhhxAAAAAElFTkSuQmCC + + + + 249, 17 + + + 249, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIFSURBVDhPpZLtS1NhGMbPPxJmmlYSgqHiKzGU1EDxg4iK + YKyG2WBogqMYJQOtCEVRFBGdTBCJfRnkS4VaaWNT5sqx1BUxRXxDHYxAJLvkusEeBaPAB+5z4Jzn+t3X + /aLhnEfjo8m+dCoa+7/C3O2Hqe0zDC+8KG+cRZHZhdzaaWTVTCLDMIY0vfM04Nfh77/G/sEhwpEDbO3t + I7TxE8urEVy99fT/AL5gWDLrTB/hnF4XsW0khCu5ln8DmJliT2AXrcNBsU1gj/MH4nMeKwBrPktM28xM + cX79DFKrHHD5d9D26hvicx4pABt2lpg10zYzU0zr7+e3xXGcrkEB2O2TNec9nJFwB3alZn5jZorfeDZh + 6Q3g8s06BeCoKF4MRURoH1+BY2oNCbeb0TIclIYxOhzf8frTOuo7FxCbbVIAzpni0iceEc8vhzEwGkJD + lx83ymxifejdKjRNk/8PWnyIyTQqAJek0jqHwfEVscu31baIu8+90sTE4nY025dQ2/5FIPpnXlzKuK8A + HBUzHot52djqQ6HZhfR7IwK4mKpHtvEDMqvfCiQ6zaAAXM8x94aIWTNrLLG4kVUzgaTSPlzLtyJOZxbb + 1wtfyg4Q+AfA3aZlButjSfxGcUJBk4g5tuP3haQKRKXcUQDOmbvNTpPOJeFFjordZmbWTNvMTHFUcpUC + nOccAdABIDXXE1nzAAAAAElFTkSuQmCC diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/AGVNavigationCore.csproj b/Cs_HMI/AGVLogic/AGVNavigationCore/AGVNavigationCore.csproj index d04e3fc..38dd5f6 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/AGVNavigationCore.csproj +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/AGVNavigationCore.csproj @@ -47,6 +47,7 @@ prompt + diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs index 35883c7..e79563c 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs @@ -56,11 +56,81 @@ namespace AGVNavigationCore.Controls if (hitNode != null) { - // 노드 속성 편집 (이벤트 발생) - NodeSelected?.Invoke(this, hitNode); + // 노드 타입별 더블클릭 액션 + switch (hitNode.Type) + { + case NodeType.Normal: + case NodeType.Rotation: + case NodeType.Docking: + case NodeType.Charging: + HandleNormalNodeDoubleClick(hitNode); + break; + + case NodeType.Label: + HandleLabelNodeDoubleClick(hitNode); + break; + + case NodeType.Image: + HandleImageNodeDoubleClick(hitNode); + break; + + default: + // 기본 동작: 노드 선택 이벤트 발생 + NodeSelected?.Invoke(this, hitNode); + break; + } } } + private void HandleNormalNodeDoubleClick(MapNode node) + { + // RFID 입력창 표시 + string currentRfid = node.RfidId ?? ""; + string newRfid = Microsoft.VisualBasic.Interaction.InputBox( + $"노드 '{node.Name}'의 RFID를 입력하세요:", + "RFID 설정", + currentRfid); + + if (!string.IsNullOrWhiteSpace(newRfid) && newRfid != currentRfid) + { + node.RfidId = newRfid.Trim(); + MapChanged?.Invoke(this, EventArgs.Empty); + Invalidate(); + } + + // 노드 선택 이벤트도 발생 (속성창 업데이트) + NodeSelected?.Invoke(this, node); + } + + private void HandleLabelNodeDoubleClick(MapNode node) + { + // 라벨 텍스트 입력창 표시 + string currentText = node.Name ?? "새 라벨"; + string newText = Microsoft.VisualBasic.Interaction.InputBox( + "라벨 텍스트를 입력하세요:", + "라벨 편집", + currentText); + + if (!string.IsNullOrWhiteSpace(newText) && newText != currentText) + { + node.Name = newText.Trim(); + MapChanged?.Invoke(this, EventArgs.Empty); + Invalidate(); + } + + // 노드 선택 이벤트도 발생 (속성창 업데이트) + NodeSelected?.Invoke(this, node); + } + + private void HandleImageNodeDoubleClick(MapNode node) + { + // 이미지 노드는 선택 이벤트만 발생 (MainForm에서 이미지 편집 버튼 활성화됨) + NodeSelected?.Invoke(this, node); + + // 이미지 편집 이벤트 발생 (MainForm에서 처리) + ImageNodeDoubleClicked?.Invoke(this, node); + } + private void UnifiedAGVCanvas_MouseDown(object sender, MouseEventArgs e) { var worldPoint = ScreenToWorld(e.Location); diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.cs index d053046..c340465 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.cs @@ -142,6 +142,7 @@ namespace AGVNavigationCore.Controls public event EventHandler NodeDeleted; public event EventHandler NodeMoved; public event EventHandler<(MapNode From, MapNode To)> ConnectionDeleted; + public event EventHandler ImageNodeDoubleClicked; public event EventHandler MapChanged; #endregion