diff --git a/Cs_HMI/AGVLogic/AGVMapEditor/AGVMapEditor.csproj b/Cs_HMI/AGVLogic/AGVMapEditor/AGVMapEditor.csproj index 928fd1c..48dbb09 100644 --- a/Cs_HMI/AGVLogic/AGVMapEditor/AGVMapEditor.csproj +++ b/Cs_HMI/AGVLogic/AGVMapEditor/AGVMapEditor.csproj @@ -62,7 +62,6 @@ - Form diff --git a/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.Designer.cs b/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.Designer.cs index 9dddbeb..b1d854f 100644 --- a/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.Designer.cs +++ b/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.Designer.cs @@ -64,6 +64,9 @@ 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.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripDropDownButton(); + this.allTurnLeftRightCrossOnToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.statusStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); this.splitContainer1.Panel1.SuspendLayout(); @@ -351,7 +354,9 @@ namespace AGVMapEditor.Forms this.btnClose, this.toolStripSeparator3, this.btnSave, - this.btnSaveAs}); + this.btnSaveAs, + this.toolStripSeparator2, + this.toolStripButton1}); this.toolStrip2.Location = new System.Drawing.Point(0, 0); this.toolStrip2.Name = "toolStrip2"; this.toolStrip2.Size = new System.Drawing.Size(1200, 25); @@ -417,6 +422,28 @@ namespace AGVMapEditor.Forms this.btnSaveAs.ToolTipText = "다른 이름으로 저장"; this.btnSaveAs.Click += new System.EventHandler(this.btnSaveAs_Click); // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); + // + // toolStripButton1 + // + this.toolStripButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.allTurnLeftRightCrossOnToolStripMenuItem}); + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Size = new System.Drawing.Size(68, 22); + this.toolStripButton1.Text = "Debig"; + // + // allTurnLeftRightCrossOnToolStripMenuItem + // + this.allTurnLeftRightCrossOnToolStripMenuItem.Name = "allTurnLeftRightCrossOnToolStripMenuItem"; + this.allTurnLeftRightCrossOnToolStripMenuItem.Size = new System.Drawing.Size(223, 22); + this.allTurnLeftRightCrossOnToolStripMenuItem.Text = "All TurnLeft/Right/Cross On"; + this.allTurnLeftRightCrossOnToolStripMenuItem.Click += new System.EventHandler(this.allTurnLeftRightCrossOnToolStripMenuItem_Click); + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); @@ -490,5 +517,8 @@ 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.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripDropDownButton toolStripButton1; + private System.Windows.Forms.ToolStripMenuItem allTurnLeftRightCrossOnToolStripMenuItem; } } \ 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 9ff2d75..49210b1 100644 --- a/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.cs +++ b/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.cs @@ -221,8 +221,8 @@ namespace AGVMapEditor.Forms toolStripStatusLabel1.Text = $"{nodes.Count}개 노드 선택됨 - PropertyGrid에서 공통 속성 일괄 변경 가능"; // 다중 선택 PropertyWrapper 표시 - var multiWrapper = new MultiNodePropertyWrapper(nodes); - _propertyGrid.SelectedObject = multiWrapper; + //var multiWrapper = new MultiNodePropertyWrapper(nodes); + _propertyGrid.SelectedObjects = nodes.ToArray();// multiWrapper; _propertyGrid.Focus(); } } @@ -833,11 +833,10 @@ namespace AGVMapEditor.Forms foreColor = Color.Black; backColor = Color.White; break; - case NodeType.Rotation: - foreColor = Color.DarkOrange; - backColor = Color.LightYellow; - break; - case NodeType.Docking: + case NodeType.Loader: + case NodeType.UnLoader: + case NodeType.Clearner: + case NodeType.Buffer: foreColor = Color.DarkGreen; backColor = Color.LightGreen; break; @@ -975,9 +974,7 @@ namespace AGVMapEditor.Forms return; } - // 노드 래퍼 객체 생성 (타입에 따라 다른 래퍼 사용) - var nodeWrapper = NodePropertyWrapperFactory.CreateWrapper(_selectedNode, _mapNodes); - _propertyGrid.SelectedObject = nodeWrapper; + _propertyGrid.SelectedObject = _selectedNode; _propertyGrid.Focus(); // 이미지 노드인 경우 편집 버튼 활성화 @@ -989,8 +986,7 @@ namespace AGVMapEditor.Forms /// private void ShowCanvasProperties() { - var canvasWrapper = new CanvasPropertyWrapper(_mapCanvas); - _propertyGrid.SelectedObject = canvasWrapper; + _propertyGrid.SelectedObject = _mapCanvas; DisableImageEditButton(); } @@ -1124,7 +1120,9 @@ namespace AGVMapEditor.Forms UpdateTitle(); // 🔥 다중 선택 여부 확인 및 선택된 노드들 저장 - bool isMultiSelect = _propertyGrid.SelectedObject is MultiNodePropertyWrapper; + bool isMultiSelect = _propertyGrid.SelectedObjects is MapNode[]; // _propertyGrid.SelectedObject is MapNode[]; + + //var a = _propertyGrid.SelectedObject; List selectedNodes = null; if (isMultiSelect) { @@ -1146,9 +1144,9 @@ namespace AGVMapEditor.Forms // 🔥 다중 선택인 경우 MultiNodePropertyWrapper를 다시 생성하여 바인딩 if (isMultiSelect && selectedNodes != null && selectedNodes.Count > 0) { - System.Diagnostics.Debug.WriteLine($"[PropertyGrid] MultiNodePropertyWrapper 재생성: {selectedNodes.Count}개"); - var multiWrapper = new MultiNodePropertyWrapper(selectedNodes); - _propertyGrid.SelectedObject = multiWrapper; + // System.Diagnostics.Debug.WriteLine($"[PropertyGrid] MultiNodePropertyWrapper 재생성: {selectedNodes.Count}개"); + //var multiWrapper = new MultiNodePropertyWrapper(selectedNodes); + _propertyGrid.SelectedObjects = selectedNodes.ToArray();// multiWrapper; } // PropertyGrid 새로고침 @@ -1180,18 +1178,18 @@ namespace AGVMapEditor.Forms var selectedObject = _propertyGrid.SelectedObject; // 다양한 PropertyWrapper 타입 처리 - if (selectedObject is NodePropertyWrapper nodeWrapper) - { - currentNodeId = nodeWrapper.WrappedNode?.NodeId; - } - else if (selectedObject is LabelNodePropertyWrapper labelWrapper) - { - currentNodeId = labelWrapper.WrappedNode?.NodeId; - } - else if (selectedObject is ImageNodePropertyWrapper imageWrapper) - { - currentNodeId = imageWrapper.WrappedNode?.NodeId; - } + //if (selectedObject is NodePropertyWrapper nodeWrapper) + //{ + // currentNodeId = nodeWrapper.WrappedNode?.NodeId; + //} + //else if (selectedObject is LabelNodePropertyWrapper labelWrapper) + //{ + // currentNodeId = labelWrapper.WrappedNode?.NodeId; + //} + //else if (selectedObject is ImageNodePropertyWrapper imageWrapper) + //{ + // currentNodeId = imageWrapper.WrappedNode?.NodeId; + //} int duplicateCount = 0; foreach (var node in _mapNodes) @@ -1370,5 +1368,46 @@ namespace AGVMapEditor.Forms #endregion + private void allTurnLeftRightCrossOnToolStripMenuItem_Click(object sender, EventArgs e) + { + //모든노드의 trun left/right/ cross 속성을 true로 변경합니다 + if (_mapNodes == null || _mapNodes.Count == 0) + { + MessageBox.Show("맵에 노드가 없습니다.", "알림", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + var result = MessageBox.Show( + $"모든 노드({_mapNodes.Count}개)의 회전/교차 속성을 활성화하시겠습니까?\n\n" + + "• CanTurnLeft = true\n" + + "• CanTurnRight = true\n" + + "• DisableCross = false", + "일괄 속성 변경", + MessageBoxButtons.YesNo, + MessageBoxIcon.Question); + + if (result == DialogResult.Yes) + { + foreach (var node in _mapNodes) + { + node.CanTurnLeft = true; + node.CanTurnRight = true; + node.DisableCross =false; + node.ModifiedDate = DateTime.Now; + } + + _hasChanges = true; + UpdateTitle(); + RefreshMapCanvas(); + + MessageBox.Show( + $"{_mapNodes.Count}개 노드의 회전/교차 속성이 모두 활성화되었습니다.", + "완료", + MessageBoxButtons.OK, + MessageBoxIcon.Information); + + UpdateStatusBar($"모든 노드의 회전/교차 속성 활성화 완료"); + } + } } } \ 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 5346a8d..ab2891a 100644 --- a/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.resx +++ b/Cs_HMI/AGVLogic/AGVMapEditor/Forms/MainForm.resx @@ -120,22 +120,40 @@ 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 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHrSURBVDhPldBNiBJhHMfx/ykKiohQ18tEhygyWGQRJwh1 - fcHAt7qJ3TOj6FJ0akP06G2RPQd1MNhKcxvCxDc2UHbXSCoWNu8dWp3ReTks/moGVnafjW33c/rPM8/3 - 4eEhOoLJZ/6UvDp7l10/lNKa4+TW3AN9Hq9eC8kNW1ef1QZ3UapzRztMbs1+lVs2Qa5fLqsbtzBucE9G - NetwVD2fYPf+07h5ZUH9koD24yG0rWdQ1kMQK2eVXzXTaXbv1Lh9dUZu2apy4xLUjSi0nxk0X0bRLd7B - Vu0elM48xE8nIX6kJbbdZ1znFpTubTRfxaBpGiaTCdbfJaB+v4+BQN+2y3SBbaak5oxJqlqEcDiMTqcD - VVXR6/VQexGCtvkYYplG4gfi2c6gVKzcqHKuGIvFkEwmkcvlUCgUUF6ah7b5FIMV2hFXaG1YoudsOxWN - Ro2Y53l4vV5EIhHIayFIVSsk4Qy2S8SxzdRu7HQ64fF4YDab9SsvDt7Tjlii62KRusM3lGI7QzweRzab - NWK32w2TyQR9XSrRDfEtCfqM13Ti9zLdZFsKBoPIZDIH4l3DZQrs/d7H5/MhnU7D4XDA5XIdiA+VSqXQ - 7/dht9sRCASOF+v0A9rtNvL5vPFg7P//8vv9j/RrWyyW48d//QFpDAsmbMS+zgAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHrSURBVDhPldBNiBJhHMfx/ykKKohQ18tEhygyWGQRJwh1 + fcHAt7qJ3TOj6FJ0akP06C1kz0EdDLbS3IbaxJdhA2V3jaRiYfPeIXPGeTss/mqElfbZ2HY/p/8883wf + Hh6iAxh/5I+pq7M32fV9aeIcp4pzd8xZWb0UUZuOrjnrTe6s3OAOdpgqzn5WRYegNs5X9Y1rUJrcg1Hd + PhzVTqfYvf+ktC4s6J9SML7dhbH1CNp6BMP3J7Ufdctxdu+U0r44o4qOmto8B30jDuN7Dq1ncXTLN7BV + vwWtMw/pw1FI72iRbXdRGtyC1r2O1vMEDMPAeDzG+usU9K+38UugL4MqnWGbKbk1Y5FrNiEajaLT6UDX + dfR6PdSfRmBs3odUpZH0lni2m9BW7Nxo5VQ5kUggnU6jUCigVCqhujgPY/MhBsu0LS3T2rBCj9l2Kh6P + T2Ke5+H3+xGLxaCuRSDX7JCFExhUiGObqZ3Y7XbD5/PBarWaV34yeEPbUoUuS2XqDl9Shu0mkskk8vn8 + JPZ6vbBYLDDX5QpdkV6RYM54QUd+LtFVtqVwOIxcLrcn3jFcotDf37sEAgFks1m4XC54PJ498b4ymQz6 + /T6cTidCodDhYpN5QLvdRrFYnDwY+/+/gsHgPfPaNpvt8PEfvwFcBQshDC9YfwAAAABJRU5ErkJggg== @@ -156,75 +174,75 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHMSURBVDhPnZJfa9pQGMb7JXa7sW9RCP1ku1lXRi+3luJa - dteOjYi5CJhoBIPGLYkExb8zic5molPnoAO3k80ozzhHTopzq2wPhHDe8z6/5yV599rtNlqtFhqNBur1 - Omq1GqrVKiqVCn3f29ulZrOJ1Wq19QyHQwYxDONuCE2mhsFgwJKDIIghtOY4zt0QOjJtpmn0XC6XK/P5 - HFEUsToFWpb1dwhN5Y22bf80TXMQhiE+f/qOd9qU3fX7fZRKpT9DaDIfeblcgpq/TEO8OPJx8sjD2+wa - 0uv1UCgUoKrqJsRxHDKbzVjTYrFgyYknPi6f9fH6LMD5UTeG+L6PfD6/CbFt+8CyLDKdrpvc+g1Lvjq5 - hnj+cQvieR40TduEmKYpFItFMplMWFO39RWJQw+vTm8hiUMfhrq+73Q6UBQFoijeQgzDEHRdJ+PxeAvy - JhHg5XEPF8fvEUVLNkUmk0EqlXoQA6h0XRdyuRwZjUYx5Oyxi4unXVyddvFtHsZmURQfbpi5NE0Tstks - oZvIPlzzBpfPP+BHGO02cymKIqTTaUI3kf9ialZVdbeZS5blfVmWCV0w13X/zcwlSdK+JEnkv8xcFJJM - Ju//Xuf6Be3RFseUK14pAAAAAElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHISURBVDhPnZJfb9JgFMb3JbzV+C2WNPtk3jgXs0vdsuAW + 7zajKaEXTWjhvShpilBIA+GvtAWxIyAgJjNBW6WQx5yXtBPREX2SpnnPe57fc9KevXa7jVarhUajgXq9 + jlqthmq1ikqlQu97e7vUbDaxWq22nuFwyCGGYdwNoWQyDAYDnux5XgyhmmVZd0NoZGqmNDqXy+XKfD5H + GIa8TkDTNP8OodRfGn8UCoVBEAT49PEbCmzK7/r9PvL5/J8hlByNvFwuQebP0wAvjlycPHLwNruG9Ho9 + 6LoOVVU3IZZl+bPZjDctFguenHji4vJZH6/PPJwfdWOI67rQNG0TUiqVDkzT9KfTdZNdv+HJVycfIJ5f + b0EcxwFjbBNSLBYFXdf9yWTCm7qtL0gcOnh1egtJHLow1PV9p9OBoigQRfEWYhiGoGmaPx6PtyBvEh5e + HvdwcfwOYbjkU2QyGaRSqQcxgJTL5QTGmD8ajWLI2WMbF0+7uDrt4us8iM2iKD7cMEdijAnZbNanTeQf + rnmDy+fv8T0Id5sjKYoipNNpnzYx+sVkVlV1tzmSLMv7siz7tGC2bf+bOZIkSfuSJPn/ZY5EkGQyef/3 + eqSfzGgWuCCdbTAAAAAASUVORK5CYII= iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAG8SURBVDhPnZLditpQFIXnJXrb0rcYCH2wXhSZwly2U0rp - O0TMRUp+BTMaIYkERY3BH0TEalW8KEV6gp4cVjlnOBms7Ui7IITsvde3NmRfpWmKwWCAfr+PXq+HbreL - TqeDdrvN38+uLilJEjDGzp7lcikgvu8/DeHJ3LBYLETyfD4vILwWx/HTEL4yH+Zp/LvVarX3+z0opaLO - gWEY/h3CU+VgFEWHIAgWWZaBfv8GmjqiN5vN0Gw2/wzhyXLlPM/BzezHFrl9g/zLa9DUFr3pdIp6vQ7L - sk4hcRyT3W4nho7Ho0jOrRKY9w6s8RHMvikgk8kEtVrtFBJF0aswDMl2u32AfO2KZHZ/B9b8fAYZj8dw - XfcUEgSB0mg0yGazeYCsElCzBHb/4RFilUATQ/SHwyFM04Sqqo8Q3/cVz/PIer0+h/ifwNxb/DRvwXIq - trBtG5VK5UUB4PI8T6lWq2S1WhWQo/EGzHmLrHaHA9kXZlVVX56YpVzXVRzHIfwSBWTZB/Xegx2yy2Yp - 0zQVwzAIv0T5i7nZsqzLZild1691XSf8wEaj0b+ZpTRNu9Y0jfyXWYpDyuXy89/rUr8A4v0dufOO1X4A - AAAASUVORK5CYII= + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAG6SURBVDhPnZLditpQFIXnJXrb0rcYCH2wXhSZwly2U0rp + O0TMRUr+zkUyaUSjBEWNwR9ExGpVvCiDzAl6cljlnCGZWtuRdkEI2Xuvb23IvkiSBP1+H71eD91uF51O + B+12G61WS7yfXZxTHMfgnJ88i8VCQoIgeBoikoVhPp/L5NlsVkBELYqipyFiZTEs0sR3s9ls7XY7MMZk + XQDDMPw7RKT+Mriv1WrzNE3BfnwHSxzZm06nqFarf4aI5HzlLMsgzPxug8y+QvblNVhiy95kMoHv+7As + 6xgSRRHdbrdy6HA4yOTMKoF778C/fgS3rwrIeDyG67rHkEaj8SoMQ7rZbB4g3zoymd/egFc/n0BGoxEI + IceQer2u+L5P1+v1A2QZg5kl8NsPjxCrBBYbsj8YDGCaJlRVfYQEQaC4rktXq9UpJPgETq5xb16DZ0xu + Yds2KpXKiwIg5HmeQgihy+WygByMN+DOW6TuDfZ0V5hVVX15ZM5FCFEcx6HiEiVk0QPz3oPv0/PmXKZp + KoZhUHGJ+S8WZsuyzptz6bp+qes6FQc2HA7/zZxL07RLTdPof5lzCUi5XH7+ez3XT8GUHaqSv5fjAAAA + AElFTkSuQmCC iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHeSURBVDhPnZLda9NgFMb3T3ir+F8Mwv6e3cgcorfToYgK - Or/unF94ldJsZm3SJq4xTSFJDSlt09oPSilpa1sKilbfsn7wyPtCInG6og+EkHPO83sO5KxVq1VUKhWU - y2WUSiUUi0UUCgW4rkvf59ZWyfM8LJfLU0+v12MQwzDOhtBkavB9nyV3Op0QQmuO45wNoSvTYZpGv/P5 - vDuZTDCfz1mdAi3L+juEpgaDtm2fmKbpT6dTjL50kfUOWa/dbiOXy/0ZQpODlReLBah5/PUTHia2cfdg - E7p3wHqtVgu6rkOW5SjEcRwyHo/Z0Gw2w/BzF3uJy3j2bgcvtZt4lNgOIc1mE5lMJgqxbXvDsiwyGo3Y - 0Ef/A+4dbuL58Q280e/glXYrAmk0GlAUJQoxTZPLZrNkOByyoXq3gAfiFl4c74aQvaMtZEox1q/VapAk - CTzP/4IYhsFpmkYGg8EpyOv3t/FUvoonR9cwX8zYFqlUCvF4/EIIoNI0jVNVlfT7/RBy/+0lPE5ewb66 - i+8/voVmnucvRsyBFEXh0uk0oZfI1vVd7KvXMT0hq82BJEnikskkoZcY/GJqlmV5tTmQKIrroigSemD1 - ev3fzIEEQVgXBIH8lzkQhcRisfO/1wP9BF1iD3Q2XAPzAAAAAElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHdSURBVDhPnZLda9NgFMb3T3ir+F8Mgn/PbmQO0Vt1KKKC + zo/dbX7hVUqzmbVJ+84lxpQ2rSGlbVr7QSklbW1LQdHqW9YPHnlfSDROV/SBEHLOeX7PgZyVSqWCcrmM + UqmEYrGIQqGAfD4Px3HY+8zKMrmui8ViceLpdrscYprm6RCWzAye5/HkdrsdQFjNtu3TIWxlNszS2Hcu + l3PG4zFmsxmvM6BlWX+HsNRfBo/T6bQ3mUww/NzBO3ef91qtFlKp1J8hLNlfeT6fg5lHXz7iYWwDd/fW + YLh7vNdsNmEYBlRVDUNs26aj0YgPTadTDD51sBW7hJ031/Bcv4lHsY0A0mg0oGlaGJLNZi9YlkWHwyEf + +uC9x739NTw9uoFXxh280G+FIPV6HYSQMCSTyQiGYdDBYMCHap08HsjreHa0GUC2DtahFSO8X61WoSgK + RFH8CTFNU9A0jfb7/ROQl29vY1u9gicHVzGbT/kWiUQC0Wj0XABg0nVdIITQXq8XQO6/vojH8cvYPdzE + t+9fA7MoiudDZl+EECGZTFJ2iXxdz8Hu4XVMjulysy9FUYR4PE7ZJfq/mJlVVV1u9iXL8qosy5QdWK1W + +zezL0mSViVJov9l9sUgkUjk7O91Xz8AO/kPZbC5CrgAAAAASUVORK5CYII= iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGpSURBVDhP7Y87TyJRGIZR9AdYiYWFMdb+AYvNopXRWJho - oY1aWGyzW8DuFmplobGxMxkPrVrY4f0SHJhhmBmGAYMxiIjcxkGh8ZZoeM05UWPG6w/wTZ7m5Hve8302 - 23dYPB6PkxASJITgiyQ5jut+LiCExFVVRDabYORylCNGPp9kFArHMIwUDOMEsZhKSzIvC8xUKg5B8MPn - 8zF4noff70cgEIAgCAgGg5AkCaqqshKO424sBQeQJJGJVikUCkFRFCbregSmmXldkE4fQlFkiKLIRCrJ - ssykcDiMSCQCXdexvx9DsZh7XXB6moCmqUyiv1FJ0zQmRqNRKHNj2BtswZazFrv9jVj83Xv3JGNnZxPn - 53lcXFAKKJUMlMtnj5hILE4j6mrDjXcGlfgarhb+QP7ViiX3AFjBZ3h7HLj2zgCzXYC7DphsQnHqB1Z6 - 6vF8xkfZ+FlTqajLeJnyuAP03Tr7Ztbb7ZnL+WFg3IFblw0llw3pUTvWOuxZ6+yb4fsaJqSh5ru8uwnm - v1okR6qw3Vlzv9pe/d86+274vsa/6057iq5NN3qSHwBTm6pq5+CDSAAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGvSURBVDhP7Y+/TxphGMdR4A9wKh0cNHHuP9ChKXQxsWEw + oYMOjR06dGg6QNuhdHLQsLgZ8GVFBzcqRGtDD+447o7jwGAMIkV+ncevpa0mGr7N+0YNOX+0f0C/yWd5 + 83y+7/NYLP/DEg6HnYSQNCEE/0g5FAo9vy4ghBQVRUC9XmI0GpRDRrNZZrRaR9D1CnT9BwoFhZbUhguM + SqUInk8ikUgwOI5DMplEKpUCz/NIp9MQRRGKorCSYDB4airYhygKTDRLmUwGsiwzWdNyMIzazYJq9QCy + LEEQBCZSSZIkJmWzWeRyOWiahr29Atrtxs2C4+MSVFVhEv2NSqqqMjGfz0Ne/YTv81PYcdrx7cU4Im9n + z69k7O5uo9NpotultNDr6ej3Ty4xUFpfRt77GKfRAAbFGH5F3kF68wgbvjmwgr8RdTvwOxoAVmYA3xiw + OIH20hN8cT/A9Rn3Jf7UNhgomxhO3+8AfTfP3pq4y1r7ubYA+B0481rQ81pQfW1F7Jm1bp69NZzn4Wfx + 5eR50zcB44Md5Vcj+Dptu9hyjX40z94ZzjP+Pu60VujadKMr+Q87TKpZvTdvaAAAAABJRU5ErkJggg== iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAL4SURBVDhPfdLfT9NXGMdx/oPdL17twmQxi97sajfTzV+b - 2Q91CxuxZGt0mWMxy3TFMhRx+hUqBVoI0FoqvxxrVSZFwHWtWuy0gy8UykAdiggMEGq/7bftkTB8L222 - TojbJ3muznNeJznPk2V39ZfZ2+RZs1NWjC3PqeaVVemQFetFuTzrn9ja5bm5R4+eqvE48YT431pQBXOR - GDXOvkgGSL0cU+NUd0xS1hGk6PIPNPSZcQx+x7lgMVU+A5/XW/ja1oPONsJ8TGByDigZoLxFVlJ6zeVJ - pK5uGnrNtA4dxNr7GTW3tNQG9mNwH2d/XQt6+yhzynOAWEJQ1zVFUWcT3weLqQ3spfKXPRh8HyFdz8bo - +4pc02kKG+8wqyQxOftXAkpCYO2e5qirgbNyIRV+DdK1Dznm3cmRn3ciefLQVJRgb23idks2v186QdC2 - hWD1Ok0aiMQFtit/ILk6MftOUe7XUuTdhf6ndznqyebbH/OpbjzEjFeHMtQB6jSRofP4S7fNpoHHqsDu - nsHcOUi+w47UfoBSz14k9ycUOL/AWJ/H/HARi5PtzFwzkAxd5M8HNxi07RNZqVmHY4IGz2waMbmCfFOs - 4aTxTSTDRs6YthEeLmQ5eYPkvTzCv37JaJOWoCVnIWB+b20aWIgK9I530LXu4OC5t7AUvErIvpvh5s08 - Dh1mWdwkMZaLeJhDbETPaN2OpwPlmzekP7GsuU8JRwW+sauZ8ofa6Ll0gJle3d+XNYiJj4kOF3Cv7m3O - Nl5QM1MwpoHkCsB7tYSRK4dYTvoQ41qePNyDEjrM3dqtTE2MU+l4ZoxVTnkiHIkSVQXR+BMGvE381qln - sKuCqcAHJMZzCAfzGTvzPgvT95lPr7L87ypb2+RSy/n+ntRypGRHyRsQe8Bty268+hfx127Hc/L15fpG - l5o6r77Qr1jb5IoMsDrHtS8vLd6sYjFQSeDERlo/XaN269atX933n9n12gtCyl275D61fcldtul6R/4r - L63ueTZ/AZ9Hi93BxLexAAAAAElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAL5SURBVDhPfdLfT5tVHMdx/gPvjVcmGpPF6I033pip000X + f+A0uGUlk0zjxCzGzbIiDpnbM6iUQiGUFqhd2YbtBo4yYMN2W4FtFR54oMimMhkDpA10fdqn7RlB9jZt + tA4y/STfq/M9r5Oc7zfP4R2tdnTI4TqPrJraHlKu9WV2y6q9Q67J+yfNXSORcCRyX0smSabE/9ayJojE + EjS6h2M5IPNyQkvS0D1HdbdC+fnvcY5YcI9/wymlgvqAkY9bbXzeMoC+ZYqlhKDWM6bmgJo2Wc3ojefn + kHr7cA5baJ84gH34IxqvF2EN7sPYf4R9TScxOG4QUR8CJFKCpt55yntcnFYqsAb3Unt1N8bA+0hXCjAF + PqOw7lvKTvxCWE1T6xldD6gpgb1vgcNeJ9/JZZiHdEiX3+Nrfz5f/ZiP5CtGZ67E0e7i5skCfjt3FKXl + FZSGTbosEEsKWi78geTtwRI4Ts1QEeX+dzBcfJPDvgK+/KGEhhMHWfTrUSe6QVsgNnGGwaqt4SxwVxM4 + +hex9IxT4nYgde2nyrcXqX8PpZ5PMLUWszRZzspcF4uXjaRDHfx5exCl+UORl5l1NCFw+sJZpM6r8EWF + jmOml5GMm2mu20p0soy19CDpW8VEf/qUG64iFNvO5aDlrSezwHJcYHC/gb59OwdOvYat9DlCjh1Mtm3h + bugQa+IaqelCxJ1dJKYMTFm33x+r2fJs9hOrXSNqNC4ITF/K1VCok4Fz+1kc1v99WYeY3Ul8spRbTa/j + cJ7VclMwZYH0OsB/qZKpCwdZSwcQM0Xcu7MbNXSIX62vMj87g9n9wBjrPfJsNBYnrgniyXuM+V383GNg + vNfMfPBdUjO7iColTDe/zfLC7yxlV3nk31W2d8pVtjOjA5nlyMjuypcgcZubth34DY8yZN2G79gLa61O + r5Y5rz87qto7ZXMO2JgjHzy1unKtnpVgLcGjmzm95zGtT7/pmY19/5n85x8RUuETqxePb1vtr37xSnfJ + 049v7HkwfwEdnYukisiEOQAAAABJRU5ErkJggg== @@ -245,16 +263,16 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHwSURBVDhP7Y7Ni1JhGMVvXadgWrWzRcTQKgXJVbQQx0/w - K7iL1FVBKdYrLW4fM9pdGCPMQpnAC+YqoY240VaTWhnouInIVubqziBFSJEGzaRN5olnIDFx/oMOvPBw - zu8cXo77r4lsNtsJxti9eDzey2azkCSpwxi7wBhTS5KkkEcZMcT+U9ZoNMdcLlcilUqh2+1CURTUajXE - YrFtSZLq7XZ7SF6j0QAxxFJnMqDX6y+Jovit1Wr1/H7/M4fDMQoGg5BlGdFoFHSTR1kul+sQS53pgcTa - 2tpAluWQ2+1eNBgM36vVKprNJur1OgqFAsijjBhiqTMZ0Ol0N0OhUD+dTt8VBKFiMpn27XY7BEE4eHST - RxkxxFJnMqDVas95PJ52Mpns5/P5r8ViEZlMBqIoIhKJHNzldYZXl8/8fmlewFP74v6T5eMPJwMcx/FG - o/G80+ncCQQCu+FweMAY++n1eq/4fD7Lo6vW4bs7FzHY3MD4fRl7+dt4E9aOXlhUt6ZHDlXJyis/NjcA - 2QOsngTWl/AlsYySmd+eZefquVk1Hr8tYlr9mBrkz7JzVbHyH3YfXwdiagxXOPRWOHRu8Cjb+I+z7Fxt - +U49eH3t7K9Pq0v4HF2AEjiCqks1KlmP3p9lD9WW73SkYuF36Nv0o7/lP1AsGrGjxCTVAAAAAElFTkSu - QmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHxSURBVDhP7Y7Ni1JhGMVvXadgWrWzRcS0S0FyFYHgOH4g + fgQXQl0NRIr1SqB9zGh34XAXs7gwgRfMVUILsY22mhmlDHTcRGQrbXVnkCKkSIOmtMk88QyMmDj/QQde + eDjndw4vx/3XWHa7/Qxj7IEkSd1sNgtRFNuMsSuMMa0oiip5lBFD7D9lnU53yu12y6lUCp1OB6qqolqt + IplM7oqiWGu1WgPy6vU6iCGWOuMBo9F4LRqNfms2m91AILDldDqHoVAIiqIgkUiAbvIoy+VybWKpMzkg + S5LUVxQl7PF45k0m0/dKpYJGo4FarYZCoQDyKCOGWOqMBwwGw+1wONxLp9P3BUEoWyyWA4fDAUEQDh/d + 5FFGDLHUGQ/o9fpLXq/3vSzLvXw+/7VYLCKTySAWiyEejx/epXWGV9cv/Hm5NIfnjvmDp4unH40HOI7j + zWbzZZfLtRcMBvcjkUifMfbL5/Mt+/1+6+Nl6+Ddvavob25g1Crhx7O7eBPRDV9YNXcmR47Vto1Xf25u + AIoXWD0LrC/gi7yILQu/O83OVHlJMxq9LWJSvaQW5E+zM1W28R/2n9wEkloMVjh0Vzi0b/Eo2fmP0+xM + 7fjPrb2+cfH3p9UFfE7MQQ2eQMWlGW7bTj6cZo/Vjv98vGzl9+jb9KOj8l/xBxqBzigbjwAAAABJRU5E + rkJggg== @@ -269,39 +287,18 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKbSURBVDhPhZBdSFNhHMbPZURXEXQTFF2trgKpdWFZWH6c - 0vmxqUu3+bUskyyMUDqm4pxk5YwsmV1MsM3M6FA0NN1mzo+Dbec9y0ihwvmeQStGpO+xguDwxjvdzXHR - A+/Ny/N7/s//T1GbCrjK1PyQkQVDphj/pFIOusrltw5DjOsvZrneQnXCl1SCy2AWXBVR/rERBAbOMUGH - XjVrL1Bx/VqGs+vAbF9x1G/LMyu5uMjkODxYauXD6ABYQVoApXpBlOpCcC1nAa7u9/dorNO2/KjvNr21 - Ce8ysvygEQTDSAUgugggahJEdB2I69cEKF0VRKlUCP/YN9WtAd5OmlXyFHCZYoGBEiYUQQUAosYNWGrY - hOuAiGoBlE55O2jG05kTU/IUP1QuB+16lSBKlxJTEyuQRgJENaTFWEuGyteVIyt5KuA0yeRgxEhAsCJd - JmE8RBfifyKqDkGpmAR4rfTWAM5RGuMeahleXM/aaIFq43AEmYGIqgS4Vs6L6PjojdPMWHPG1hXm+rTs - XK8OkEMJUCraBKsFca2CwAAizbvIzz2jbdm/3Y3p80qe8tty1TMPCqNvujVWfvnXXiEinSSVBSjpQhCl - Eniqp/DPwkg99jWcwM/rU/XKDGqyK9fst2mi3ltnwER7JkP2JW+0KZ2ZvJMnL75qwpGgHS/P3MWedg1+ - 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 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKYSURBVDhPhZBfSFNRHMfvY0RPEfQSFD2tngKj9WBZmDqX + em1t6tJtDV2WSRZGKN1ScV7JyhVZMnuYIJua0aXQ1Oamzj/DtnvuMlKocJ47aMWI9FwrCC4njrqX66Iv + nJfD9/P9fX8/itpUyFOm5nvNHOi1JMJ9VjnkschzLlMi2FXMBTvOqpO+lBI8Jpvgtsb5HjMIdZ9jwi6j + asapUwW79EzQaQDTncXxgKPQpuTWRSZvwKUsH0UHwDLSAyjVCKJUHYGr+fNwZX/gAc1OOQrj/rvarU14 + j5kjk8NRpAIQXQIQ1QsiugHEtesClK4JolQqRH/sm2ynga9Vyyl5CngsiVB3CROJIR2AqG4Dlmo34Wog + oioApVO+Fi3jZfMTSp4K91rksNOoEkTpcnJqcgXSSICokrQYachW+dvyZCVPvXWbZXIwYiQgWJaukDAe + oovrfyKqiECpmAT42NytAbOu0kTwiZ7hxTXNRgtUtQ7HkA2IqFyAq+d5ER0fvpnFjDDZW1eY7dRzsx0G + QA4lQKloE6wQxFUrgQFE9LvYzz2vm3J/D9Vlzil5KuAoUE8/1sUn2mmWX/q1V4hJJ0llAUqGCETpBJ5w + 6P7MD9Rgf+0J/KIm3ajMoMbbCmwBBx333TkNvM05DNmXvOH6TGb8Hi0vDNbjWNiJl6bv47FmGr8sV+9W + ZlB+Vqt+Y9dyoy25CXKsMbtGHryds+JtysOfxlvx1w89+NuiG3/0NuIB6zHZkyoklbirGabJ9hIcnXHg + +PtuvBx8hOeeWjGbpfr86kLadqU/pZ5XpZvG7Gfw4tAtvDDUgKceFuGBysPfnxkO7lB6/6l+2xGTuywN + jzZqcJ9V/cVtTNul9PxX/eVHd3aVHLK7LBnbkn9/ARsspRTlWFT8AAAAAElFTkSuQmCC @@ -386,6 +383,21 @@ 8maMpXiUaCpB7aVH7Drag7TDOBxajYut0FpaD0XSzP7jfWfG6eiPsZKIYLLto83zJe2eGky2UlaTi9Rd CvLG4etIrxoHvigqHxh+pXIo+nLlIEWVA6KoYkCUnXUy+Ff+FYK4Nr4lkOwikO7CtWEB5mjqCvLm5zfY 9qme1o7PBh0fmsYxmic4+v08R1pnqTJPU30uwBGzl11VN3jp427+BmRb26lRD0KdAAAAAElFTkSuQmCC + + + + + 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 \ No newline at end of file diff --git a/Cs_HMI/AGVLogic/AGVMapEditor/Models/NodePropertyWrapper.cs b/Cs_HMI/AGVLogic/AGVMapEditor/Models/NodePropertyWrapper.cs deleted file mode 100644 index 04c53f7..0000000 --- a/Cs_HMI/AGVLogic/AGVMapEditor/Models/NodePropertyWrapper.cs +++ /dev/null @@ -1,825 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Design; -using AGVNavigationCore.Models; -using AGVNavigationCore.Controls; - -namespace AGVMapEditor.Models -{ - /// - /// 노드 타입에 따른 PropertyWrapper 팩토리 - /// - public static class NodePropertyWrapperFactory - { - public static object CreateWrapper(MapNode node, List mapNodes) - { - switch (node.Type) - { - case NodeType.Label: - return new LabelNodePropertyWrapper(node, mapNodes); - case NodeType.Image: - return new ImageNodePropertyWrapper(node, mapNodes); - default: - return new NodePropertyWrapper(node, mapNodes); - } - } - } - - /// - /// 라벨 노드 전용 PropertyWrapper - /// - public class LabelNodePropertyWrapper - { - private MapNode _node; - private List _mapNodes; - - public LabelNodePropertyWrapper(MapNode node, List mapNodes) - { - _node = node; - _mapNodes = mapNodes; - } - - /// - /// 래핑된 MapNode 인스턴스 접근 - /// - public MapNode WrappedNode => _node; - - [Category("기본 정보")] - [DisplayName("노드 ID")] - [Description("노드의 고유 식별자")] - [ReadOnly(true)] - public string NodeId - { - get => _node.NodeId; - } - - [Category("기본 정보")] - [DisplayName("노드 타입")] - [Description("노드의 타입")] - [ReadOnly(true)] - public NodeType Type - { - get => _node.Type; - } - - [Category("라벨")] - [DisplayName("텍스트")] - [Description("표시할 텍스트")] - public string LabelText - { - get => _node.LabelText; - set - { - _node.LabelText = value ?? ""; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("라벨")] - [DisplayName("폰트 패밀리")] - [Description("폰트 패밀리")] - public string FontFamily - { - get => _node.FontFamily; - set - { - _node.FontFamily = value ?? "Arial"; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("라벨")] - [DisplayName("폰트 크기")] - [Description("폰트 크기")] - public float FontSize - { - get => _node.FontSize; - set - { - _node.FontSize = Math.Max(6, Math.Min(72, value)); - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("라벨")] - [DisplayName("폰트 스타일")] - [Description("폰트 스타일")] - public FontStyle FontStyle - { - get => _node.FontStyle; - set - { - _node.FontStyle = value; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("라벨")] - [DisplayName("전경색")] - [Description("텍스트 색상")] - public Color ForeColor - { - get => _node.ForeColor; - set - { - _node.ForeColor = value; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("라벨")] - [DisplayName("배경색")] - [Description("배경 색상")] - public Color BackColor - { - get => _node.BackColor; - set - { - _node.BackColor = value; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("라벨")] - [DisplayName("배경 표시")] - [Description("배경을 표시할지 여부")] - public bool ShowBackground - { - get => _node.ShowBackground; - set - { - _node.ShowBackground = value; - _node.ModifiedDate = DateTime.Now; - } - } - - [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 좌표")] - public int PositionX - { - get => _node.Position.X; - set - { - _node.Position = new Point(value, _node.Position.Y); - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("위치")] - [DisplayName("Y 좌표")] - [Description("맵에서의 Y 좌표")] - public int PositionY - { - get => _node.Position.Y; - set - { - _node.Position = new Point(_node.Position.X, value); - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("정보")] - [DisplayName("생성 일시")] - [Description("노드가 생성된 일시")] - [ReadOnly(true)] - public DateTime CreatedDate - { - get => _node.CreatedDate; - } - - [Category("정보")] - [DisplayName("수정 일시")] - [Description("노드가 마지막으로 수정된 일시")] - [ReadOnly(true)] - public DateTime ModifiedDate - { - get => _node.ModifiedDate; - } - } - - /// - /// 이미지 노드 전용 PropertyWrapper - /// - public class ImageNodePropertyWrapper - { - private MapNode _node; - private List _mapNodes; - - public ImageNodePropertyWrapper(MapNode node, List mapNodes) - { - _node = node; - _mapNodes = mapNodes; - } - - /// - /// 래핑된 MapNode 인스턴스 접근 - /// - public MapNode WrappedNode => _node; - - [Category("기본 정보")] - [DisplayName("노드 ID")] - [Description("노드의 고유 식별자")] - [ReadOnly(true)] - public string NodeId - { - get => _node.NodeId; - } - - [Category("기본 정보")] - [DisplayName("노드 타입")] - [Description("노드의 타입")] - [ReadOnly(true)] - public NodeType Type - { - get => _node.Type; - } - - [Category("이미지")] - [DisplayName("이미지 경로")] - [Description("이미지 파일 경로 (... 버튼으로 파일 선택)")] - [Editor(typeof(ImagePathEditor), typeof(UITypeEditor))] - public string ImagePath - { - get => _node.ImagePath; - set - { - if (string.IsNullOrEmpty(value)) - { - _node.ImagePath = ""; - return; - } - - // 파일이 존재하면 Base64로 변환하여 저장 - if (System.IO.File.Exists(value)) - { - _node.ConvertImageToBase64(value); - _node.LoadImage(); // 이미지 다시 로드 - } - else - { - _node.ImagePath = value; - } - - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("이미지")] - [DisplayName("가로 배율")] - [Description("가로 배율 (1.0 = 원본 크기)")] - public float ScaleWidth - { - get => _node.Scale.Width; - set - { - _node.Scale = new SizeF(Math.Max(0.1f, Math.Min(5.0f, value)), _node.Scale.Height); - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("이미지")] - [DisplayName("세로 배율")] - [Description("세로 배율 (1.0 = 원본 크기)")] - public float ScaleHeight - { - get => _node.Scale.Height; - set - { - _node.Scale = new SizeF(_node.Scale.Width, Math.Max(0.1f, Math.Min(5.0f, value))); - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("이미지")] - [DisplayName("투명도")] - [Description("투명도 (0.0 = 투명, 1.0 = 불투명)")] - public float Opacity - { - get => _node.Opacity; - set - { - _node.Opacity = Math.Max(0.0f, Math.Min(1.0f, value)); - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("이미지")] - [DisplayName("회전각도")] - [Description("회전 각도 (도 단위)")] - public float Rotation - { - get => _node.Rotation; - set - { - _node.Rotation = value % 360; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("위치")] - [DisplayName("X 좌표")] - [Description("맵에서의 X 좌표")] - public int PositionX - { - get => _node.Position.X; - set - { - _node.Position = new Point(value, _node.Position.Y); - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("위치")] - [DisplayName("Y 좌표")] - [Description("맵에서의 Y 좌표")] - public int PositionY - { - get => _node.Position.Y; - set - { - _node.Position = new Point(_node.Position.X, value); - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("정보")] - [DisplayName("생성 일시")] - [Description("노드가 생성된 일시")] - [ReadOnly(true)] - public DateTime CreatedDate - { - get => _node.CreatedDate; - } - - [Category("정보")] - [DisplayName("수정 일시")] - [Description("노드가 마지막으로 수정된 일시")] - [ReadOnly(true)] - public DateTime ModifiedDate - { - get => _node.ModifiedDate; - } - } - /// - /// PropertyGrid에서 사용할 노드 속성 래퍼 클래스 - /// - public class NodePropertyWrapper - { - private MapNode _node; - private List _mapNodes; - - public NodePropertyWrapper(MapNode node, List mapNodes) - { - _node = node; - _mapNodes = mapNodes; - } - - /// - /// 래핑된 MapNode 인스턴스 접근 - /// - public MapNode WrappedNode => _node; - - [Category("기본 정보")] - [DisplayName("노드 ID")] - [Description("노드의 고유 식별자")] - [ReadOnly(true)] - public string NodeId - { - get => _node.NodeId; - set => _node.NodeId = value; - } - - [Category("기본 정보")] - [DisplayName("노드 이름")] - [Description("노드의 표시 이름")] - public string Name - { - get => _node.Name; - set - { - _node.Name = value; - _node.ModifiedDate = DateTime.Now; - } - } - - - - [Category("기본 정보")] - [DisplayName("노드 타입")] - [Description("노드의 타입 (Normal, Rotation, Docking, Charging)")] - public NodeType Type - { - get => _node.Type; - set - { - _node.Type = value; - _node.CanRotate = value == NodeType.Rotation; - _node.SetDefaultColorByType(value); - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("기본 정보")] - [DisplayName("도킹 방향")] - [Description("도킹이 필요한 노드의 경우 AGV 진입 방향 (DontCare: 방향 무관, Forward: 전진 도킹, Backward: 후진 도킹)")] - public DockingDirection DockDirection - { - get => _node.DockDirection; - set - { - _node.DockDirection = value; - _node.ModifiedDate = DateTime.Now; - } - } - - - - - - [Category("위치")] - [DisplayName("X 좌표")] - [Description("맵에서의 X 좌표")] - public int PositionX - { - get => _node.Position.X; - set - { - _node.Position = new Point(value, _node.Position.Y); - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("위치")] - [DisplayName("Y 좌표")] - [Description("맵에서의 Y 좌표")] - public int PositionY - { - get => _node.Position.Y; - set - { - _node.Position = new Point(_node.Position.X, value); - _node.ModifiedDate = DateTime.Now; - } - } - - - - [Category("고급")] - [DisplayName("회전 가능")] - [Description("이 노드에서 AGV가 회전할 수 있는지 여부")] - public bool CanRotate - { - get => _node.CanRotate; - set - { - _node.CanRotate = value; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("고급")] - [DisplayName("RFID")] - [Description("RFID ID")] - public string RFID - { - get => _node.RfidId; - set - { - _node.RfidId = value; - _node.ModifiedDate = DateTime.Now; - } - } - - - - - [Category("고급")] - [DisplayName("활성화")] - [Description("노드 활성화 여부")] - public bool IsActive - { - get => _node.IsActive; - set - { - _node.IsActive = value; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("표시")] - [DisplayName("노드 배경색")] - [Description("노드 배경 색상")] - public Color DisplayColor - { - get => _node.DisplayColor; - set - { - _node.DisplayColor = value; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("표시")] - [DisplayName("글자 색상")] - [Description("노드 텍스트 색상 (NodeId, Name 등)")] - public Color ForeColor - { - get => _node.ForeColor; - set - { - _node.ForeColor = value; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("표시")] - [DisplayName("글자 크기")] - [Description("노드 텍스트 크기 (픽셀)")] - public float TextFontSize - { - get => _node.TextFontSize; - set - { - _node.TextFontSize = Math.Max(5.0f, Math.Min(20.0f, value)); - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("표시")] - [DisplayName("글자 굵게")] - [Description("노드 텍스트 볼드 표시")] - public bool TextFontBold - { - get => _node.TextFontBold; - set - { - _node.TextFontBold = value; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("표시")] - [DisplayName("이름 말풍선 배경색")] - [Description("노드 이름 말풍선(하단 표시) 배경색")] - public Color NameBubbleBackColor - { - get => _node.NameBubbleBackColor; - set - { - _node.NameBubbleBackColor = value; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("표시")] - [DisplayName("이름 말풍선 글자색")] - [Description("노드 이름 말풍선(하단 표시) 글자색")] - public Color NameBubbleForeColor - { - get => _node.NameBubbleForeColor; - set - { - _node.NameBubbleForeColor = value; - _node.ModifiedDate = DateTime.Now; - } - } - - [Category("정보")] - [DisplayName("생성 일시")] - [Description("노드가 생성된 일시")] - [ReadOnly(true)] - public DateTime CreatedDate - { - get => _node.CreatedDate; - } - - [Category("정보")] - [DisplayName("수정 일시")] - [Description("노드가 마지막으로 수정된 일시")] - [ReadOnly(true)] - public DateTime ModifiedDate - { - get => _node.ModifiedDate; - } - } - - /// - /// 다중 노드 선택 시 공통 속성 편집용 래퍼 - /// - public class MultiNodePropertyWrapper - { - private List _nodes; - - public MultiNodePropertyWrapper(List nodes) - { - _nodes = nodes ?? new List(); - } - - [Category("다중 선택")] - [DisplayName("선택된 노드 수")] - [Description("현재 선택된 노드의 개수")] - [ReadOnly(true)] - public int SelectedCount => _nodes.Count; - - [Category("표시")] - [DisplayName("노드 배경색")] - [Description("선택된 모든 노드의 배경색을 일괄 변경")] - public Color DisplayColor - { - get => _nodes.Count > 0 ? _nodes[0].DisplayColor : Color.Blue; - set - { - foreach (var node in _nodes) - { - node.DisplayColor = value; - node.ModifiedDate = DateTime.Now; - } - } - } - - [Category("표시")] - [DisplayName("글자 색상")] - [Description("선택된 모든 노드의 글자 색상을 일괄 변경")] - public Color ForeColor - { - get => _nodes.Count > 0 ? _nodes[0].ForeColor : Color.Black; - set - { - foreach (var node in _nodes) - { - node.ForeColor = value; - node.ModifiedDate = DateTime.Now; - } - } - } - - [Category("표시")] - [DisplayName("글자 크기")] - [Description("선택된 모든 노드의 글자 크기를 일괄 변경 (5~20 픽셀)")] - public float TextFontSize - { - get => _nodes.Count > 0 ? _nodes[0].TextFontSize : 7.0f; - set - { - var validValue = Math.Max(5.0f, Math.Min(20.0f, value)); - System.Diagnostics.Debug.WriteLine($"[MultiNode] TextFontSize 변경 시작: {validValue}, 노드 수: {_nodes.Count}"); - - foreach (var node in _nodes) - { - System.Diagnostics.Debug.WriteLine($" - 노드 {node.NodeId}: {node.TextFontSize} → {validValue}"); - node.TextFontSize = validValue; - node.ModifiedDate = DateTime.Now; - System.Diagnostics.Debug.WriteLine($" - 변경 후: {node.TextFontSize}"); - } - - System.Diagnostics.Debug.WriteLine($"[MultiNode] TextFontSize 변경 완료"); - } - } - - [Category("표시")] - [DisplayName("글자 굵게")] - [Description("선택된 모든 노드의 글자 굵기를 일괄 변경")] - public bool TextFontBold - { - get - { - var result = _nodes.Count > 0 ? _nodes[0].TextFontBold : true; - System.Diagnostics.Debug.WriteLine($"[MultiNode] TextFontBold GET: {result}"); - return result; - } - set - { - System.Diagnostics.Debug.WriteLine($"[MultiNode] TextFontBold 변경 시작: {value}, 노드 수: {_nodes.Count}"); - - foreach (var node in _nodes) - { - System.Diagnostics.Debug.WriteLine($" - 노드 {node.NodeId}: {node.TextFontBold} → {value}"); - node.TextFontBold = value; - node.ModifiedDate = DateTime.Now; - System.Diagnostics.Debug.WriteLine($" - 변경 후: {node.TextFontBold}"); - } - - System.Diagnostics.Debug.WriteLine($"[MultiNode] TextFontBold 변경 완료"); - } - } - - [Category("표시")] - [DisplayName("이름 말풍선 배경색")] - [Description("선택된 모든 노드의 이름 말풍선(하단 표시) 배경색을 일괄 변경")] - public Color NameBubbleBackColor - { - get => _nodes.Count > 0 ? _nodes[0].NameBubbleBackColor : Color.Gold; - set - { - foreach (var node in _nodes) - { - node.NameBubbleBackColor = value; - node.ModifiedDate = DateTime.Now; - } - } - } - - [Category("표시")] - [DisplayName("이름 말풍선 글자색")] - [Description("선택된 모든 노드의 이름 말풍선(하단 표시) 글자색을 일괄 변경")] - public Color NameBubbleForeColor - { - get => _nodes.Count > 0 ? _nodes[0].NameBubbleForeColor : Color.Black; - set - { - foreach (var node in _nodes) - { - node.NameBubbleForeColor = value; - node.ModifiedDate = DateTime.Now; - } - } - } - - [Category("고급")] - [DisplayName("활성화")] - [Description("선택된 모든 노드의 활성화 상태를 일괄 변경")] - public bool IsActive - { - get => _nodes.Count > 0 ? _nodes[0].IsActive : true; - set - { - foreach (var node in _nodes) - { - node.IsActive = value; - node.ModifiedDate = DateTime.Now; - } - } - } - - [Category("정보")] - [DisplayName("안내")] - [Description("다중 선택 시 공통 속성만 변경할 수 있습니다")] - [ReadOnly(true)] - public string HelpText => "위 속성을 변경하면 선택된 모든 노드에 일괄 적용됩니다."; - } - - /// - /// 캔버스 속성 래퍼 (배경색 등 캔버스 전체 속성 편집) - /// - public class CanvasPropertyWrapper - { - private UnifiedAGVCanvas _canvas; - - public CanvasPropertyWrapper(UnifiedAGVCanvas canvas) - { - _canvas = canvas; - } - - [Category("배경")] - [DisplayName("배경색")] - [Description("맵 캔버스 배경색")] - public Color BackgroundColor - { - get => _canvas.BackColor; - set - { - _canvas.BackColor = value; - _canvas.Invalidate(); - } - } - - [Category("그리드")] - [DisplayName("그리드 표시")] - [Description("그리드 표시 여부")] - public bool ShowGrid - { - get => _canvas.ShowGrid; - set - { - _canvas.ShowGrid = value; - _canvas.Invalidate(); - } - } - - [Category("정보")] - [DisplayName("설명")] - [Description("맵 캔버스 전체 속성")] - [ReadOnly(true)] - public string Description - { - get => "빈 공간을 클릭하면 캔버스 전체 속성을 편집할 수 있습니다."; - } - } - -} \ No newline at end of file diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Events.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Events.cs index 9263dd7..3962036 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Events.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Events.cs @@ -416,10 +416,10 @@ namespace AGVNavigationCore.Controls case NodeType.Normal: ghostBrush = new SolidBrush(Color.FromArgb(120, 100, 149, 237)); // 반투명 파란색 break; - case NodeType.Rotation: - ghostBrush = new SolidBrush(Color.FromArgb(120, 255, 165, 0)); // 반투명 주황색 - break; - case NodeType.Docking: + case NodeType.Loader: + case NodeType.UnLoader: + case NodeType.Clearner: + case NodeType.Buffer: ghostBrush = new SolidBrush(Color.FromArgb(120, 50, 205, 50)); // 반투명 초록색 break; case NodeType.Charging: @@ -439,7 +439,10 @@ namespace AGVNavigationCore.Controls case NodeType.Image: DrawImageGhost(g); break; - case NodeType.Docking: + case NodeType.Loader: + case NodeType.UnLoader: + case NodeType.Clearner: + case NodeType.Buffer: DrawPentagonGhost(g, ghostBrush); break; case NodeType.Charging: @@ -646,7 +649,10 @@ namespace AGVNavigationCore.Controls switch (node.Type) { - case NodeType.Docking: + case NodeType.Loader: + case NodeType.UnLoader: + case NodeType.Clearner: + case NodeType.Buffer: DrawPentagonNodeShape(g, node, brush); break; case NodeType.Charging: @@ -723,6 +729,13 @@ namespace AGVNavigationCore.Controls { DrawDuplicateRfidMarker(g, node); } + + // CanCross 가능 노드 표시 (교차지점으로 사용 가능) + if (node.DisableCross==true) + { + var crossRect = new Rectangle(rect.X - 3, rect.Y - 3, rect.Width + 6, rect.Height + 6); + g.DrawEllipse(new Pen(Color.DeepSkyBlue, 3), crossRect); + } } private void DrawPentagonNodeShape(Graphics g, MapNode node, Brush brush) @@ -826,6 +839,21 @@ namespace AGVNavigationCore.Controls { DrawDuplicateRfidMarker(g, node); } + + // CanCross 가능 노드 표시 (교차지점으로 사용 가능) + if (node.DisableCross==false) + { + var crossPoints = new Point[5]; + for (int i = 0; i < 5; i++) + { + var angle = (Math.PI * 2 * i / 5) - Math.PI / 2; + crossPoints[i] = new Point( + (int)(center.X + (radius + 4) * Math.Cos(angle)), + (int)(center.Y + (radius + 4) * Math.Sin(angle)) + ); + } + g.DrawPolygon(new Pen(Color.Gold, 3), crossPoints); + } } private void DrawTriangleNodeShape(Graphics g, MapNode node, Brush brush) @@ -929,6 +957,21 @@ namespace AGVNavigationCore.Controls { DrawDuplicateRfidMarker(g, node); } + + // CanCross 가능 노드 표시 (교차지점으로 사용 가능) + if (node.DisableCross==false) + { + var crossPoints = new Point[3]; + for (int i = 0; i < 3; i++) + { + var angle = (Math.PI * 2 * i / 3) - Math.PI / 2; + crossPoints[i] = new Point( + (int)(center.X + (radius + 4) * Math.Cos(angle)), + (int)(center.Y + (radius + 4) * Math.Sin(angle)) + ); + } + g.DrawPolygon(new Pen(Color.Gold, 3), crossPoints); + } } private void DrawNodeLabel(Graphics g, MapNode node) diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs index 3101c86..15603e3 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Controls/UnifiedAGVCanvas.Mouse.cs @@ -108,8 +108,10 @@ namespace AGVNavigationCore.Controls switch (hitNode.Type) { case NodeType.Normal: - case NodeType.Rotation: - case NodeType.Docking: + case NodeType.Loader: + case NodeType.UnLoader: + case NodeType.Clearner: + case NodeType.Buffer: case NodeType.Charging: HandleNormalNodeDoubleClick(hitNode); break; @@ -429,7 +431,10 @@ namespace AGVNavigationCore.Controls { switch (node.Type) { - case NodeType.Docking: + case NodeType.Loader: + case NodeType.UnLoader: + case NodeType.Clearner: + case NodeType.Buffer: return IsPointInPentagon(point, node); case NodeType.Charging: return IsPointInTriangle(point, node); diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/Enums.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/Enums.cs index 86aa676..457de0c 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/Enums.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/Enums.cs @@ -11,10 +11,20 @@ namespace AGVNavigationCore.Models { /// 일반 경로 노드 Normal, - /// 회전 가능 지점 - Rotation, - /// 도킹 스테이션 - Docking, + /// 로더 + Loader, + /// + /// 언로더 + /// + UnLoader, + /// + /// 클리너 + /// + Clearner, + /// + /// 버퍼 + /// + Buffer, /// 충전 스테이션 Charging, /// 라벨 (UI 요소) @@ -58,6 +68,10 @@ namespace AGVNavigationCore.Models /// public enum StationType { + /// + /// 일반노드 + /// + Node, /// 로더 Loader, /// 클리너 @@ -70,6 +84,24 @@ namespace AGVNavigationCore.Models Charger } + /// + /// AGV턴상태 + /// + public enum AGVTurn + { + None=0, + + /// + /// left turn 90" + /// + L90, + /// + /// right turn 90" + /// + R90 + } + + /// /// 모터 명령 열거형 (실제 AGV 제어용) /// diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapLoader.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapLoader.cs index 1857126..7877d09 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapLoader.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapLoader.cs @@ -226,7 +226,10 @@ namespace AGVNavigationCore.Models case NodeType.Charging: node.DockDirection = DockingDirection.Forward; break; - case NodeType.Docking: + case NodeType.Loader: + case NodeType.UnLoader: + case NodeType.Clearner: + case NodeType.Buffer: node.DockDirection = DockingDirection.Backward; break; default: diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapNode.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapNode.cs index 496a842..818559e 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapNode.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/MapNode.cs @@ -34,6 +34,19 @@ namespace AGVNavigationCore.Models /// public NodeType Type { get; set; } = NodeType.Normal; + public bool CanDocking + { + get + { + if (Type == NodeType.Buffer) return true; + if (Type == NodeType.Loader) return true; + if (Type == NodeType.UnLoader) return true; + if (Type == NodeType.Clearner) return true; + if (Type == NodeType.Charging) return true; + return false; + } + } + /// /// 도킹 방향 (도킹/충전 노드인 경우에만 Forward/Backward, 일반 노드는 DontCare) /// @@ -53,18 +66,38 @@ namespace AGVNavigationCore.Models /// /// 회전 가능 여부 (180도 회전 가능한 지점) /// - public bool CanRotate { get; set; } = false; + public bool CanTurnLeft { get; set; } = true; + + /// + /// 회전 가능 여부 (180도 회전 가능한 지점) + /// + public bool CanTurnRight { get; set; } = true; + + /// + /// 교차로로 이용가능한지 + /// + public bool DisableCross + { + get + { + if (Type != NodeType.Normal) return true; + return _disablecross; + } + set { _disablecross = value; } + } + + private bool _disablecross = false; /// /// 장비 ID (도킹/충전 스테이션인 경우) /// 예: "LOADER1", "CLEANER1", "BUFFER1", "CHARGER1" /// - public string StationId { get; set; } = string.Empty; + public string NodeAlias { get; set; } = string.Empty; /// /// 장비 타입 (도킹/충전 스테이션인 경우) /// - public StationType? StationType { get; set; } = null; + // public StationType? StationType { get; set; } = null; /// /// 노드 생성 일자 @@ -224,7 +257,7 @@ namespace AGVNavigationCore.Models Type = type; CreatedDate = DateTime.Now; ModifiedDate = DateTime.Now; - + // 타입별 기본 색상 설정 SetDefaultColorByType(type); } @@ -240,10 +273,10 @@ namespace AGVNavigationCore.Models case NodeType.Normal: DisplayColor = Color.Blue; break; - case NodeType.Rotation: - DisplayColor = Color.Orange; - break; - case NodeType.Docking: + case NodeType.UnLoader: + case NodeType.Clearner: + case NodeType.Buffer: + case NodeType.Loader: DisplayColor = Color.Green; break; case NodeType.Charging: @@ -283,21 +316,20 @@ namespace AGVNavigationCore.Models } } - /// - /// 도킹 스테이션 설정 - /// - /// 장비 ID - /// 장비 타입 - /// 도킹 방향 - public void SetDockingStation(string stationId, StationType stationType, DockingDirection dockDirection) - { - Type = NodeType.Docking; - StationId = stationId; - StationType = stationType; - DockDirection = dockDirection; - SetDefaultColorByType(NodeType.Docking); - ModifiedDate = DateTime.Now; - } + ///// + ///// 도킹 스테이션 설정 + ///// + ///// 장비 ID + ///// 장비 타입 + ///// 도킹 방향 + //public void SetDockingStation(string stationId, StationType stationType, DockingDirection dockDirection) + //{ + // Type = NodeType.Docking; + // NodeAlias = stationId; + // DockDirection = dockDirection; + // SetDefaultColorByType(NodeType.Docking); + // ModifiedDate = DateTime.Now; + //} /// /// 충전 스테이션 설정 @@ -306,8 +338,7 @@ namespace AGVNavigationCore.Models public void SetChargingStation(string stationId) { Type = NodeType.Charging; - StationId = stationId; - StationType = Models.StationType.Charger; + NodeAlias = stationId; DockDirection = DockingDirection.Forward; // 충전기는 항상 전진 도킹 SetDefaultColorByType(NodeType.Charging); ModifiedDate = DateTime.Now; @@ -329,17 +360,17 @@ namespace AGVNavigationCore.Models get { var displayText = NodeId; - + if (!string.IsNullOrEmpty(Name)) { displayText += $" - {Name}"; } - + if (!string.IsNullOrEmpty(RfidId)) { displayText += $" - [{RfidId}]"; } - + return displayText; } } @@ -358,9 +389,12 @@ namespace AGVNavigationCore.Models Type = Type, DockDirection = DockDirection, ConnectedNodes = new List(ConnectedNodes), - CanRotate = CanRotate, - StationId = StationId, - StationType = StationType, + + CanTurnLeft = CanTurnLeft, + CanTurnRight = CanTurnRight, + DisableCross = DisableCross, + + NodeAlias = NodeAlias, CreatedDate = CreatedDate, ModifiedDate = ModifiedDate, IsActive = IsActive, @@ -475,7 +509,7 @@ namespace AGVNavigationCore.Models public Size GetDisplaySize() { if (Type != NodeType.Image || LoadedImage == null) return Size.Empty; - + return new Size( (int)(LoadedImage.Width * Scale.Width), (int)(LoadedImage.Height * Scale.Height) diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/VirtualAGV.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/VirtualAGV.cs index ec7cc2f..209bce3 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Models/VirtualAGV.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Models/VirtualAGV.cs @@ -61,12 +61,12 @@ namespace AGVNavigationCore.Models private int _currentNodeIndex; private MapNode _currentNode; private MapNode _prevNode; + private AGVTurn _turn; // 이동 관련 private DateTime _lastUpdateTime; private Point _moveStartPosition; private Point _moveTargetPosition; - private float _moveProgress; // 도킹 관련 private DockingDirection _dockingDirection; @@ -89,7 +89,6 @@ namespace AGVNavigationCore.Models public AgvDirection PrevDirection => _prevDirection; - /// /// AGV ID /// @@ -158,6 +157,11 @@ namespace AGVNavigationCore.Models /// public MapNode PrevNode => _prevNode; + /// + /// Turn 상태값 + /// + public AGVTurn Turn { get; set; } + /// /// 도킹 방향 /// @@ -527,10 +531,10 @@ namespace AGVNavigationCore.Models _prevPosition = targetPosition; _moveStartPosition = _currentPosition; _moveTargetPosition = targetPosition; - _moveProgress = 0; SetState(AGVState.Moving); _isMoving = true; + Turn = AGVTurn.None; } /// @@ -620,7 +624,6 @@ namespace AGVNavigationCore.Models if (item != null) { //item.IsPass = true; - //이전노드는 모두 지나친걸로 한다 CurrentPath.DetailedPath.Where(t => t.seq < item.seq).ToList().ForEach(t => t.IsPass = true); } @@ -865,7 +868,10 @@ namespace AGVNavigationCore.Models { case NodeType.Charging: return DockingDirection.Forward; - case NodeType.Docking: + case NodeType.Loader: + case NodeType.UnLoader: + case NodeType.Clearner: + case NodeType.Buffer: return DockingDirection.Backward; default: return DockingDirection.Forward; @@ -880,8 +886,6 @@ namespace AGVNavigationCore.Models #endregion - - #region Cleanup /// diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/PathFinding/Core/AStarPathfinder.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/PathFinding/Core/AStarPathfinder.cs index 1df76c8..19bff1c 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/PathFinding/Core/AStarPathfinder.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/PathFinding/Core/AStarPathfinder.cs @@ -101,7 +101,7 @@ namespace AGVNavigationCore.PathFinding.Core /// 시작 노드 ID /// 목적지 노드 ID /// 경로 계산 결과 - public AGVPathResult FindPath(string startNodeId, string endNodeId) + public AGVPathResult FindPathAStar(string startNodeId, string endNodeId) { var stopwatch = System.Diagnostics.Stopwatch.StartNew(); @@ -126,7 +126,6 @@ namespace AGVNavigationCore.PathFinding.Core var startNode = _nodeMap[startNodeId]; var endNode = _nodeMap[endNodeId]; - var openSet = new List(); var closedSet = new HashSet(); var exploredCount = 0; @@ -199,7 +198,7 @@ namespace AGVNavigationCore.PathFinding.Core // 경유지가 없으면 기본 FindPath 호출 if (waypointNodeIds == null || waypointNodeIds.Length == 0) { - return FindPath(startNodeId, endNodeId); + return FindPathAStar(startNodeId, endNodeId); } // 경유지 유효성 검증 @@ -220,7 +219,7 @@ namespace AGVNavigationCore.PathFinding.Core // 경유지가 없으면 기본 경로 계산 if (validWaypoints.Count == 0) { - return FindPath(startNodeId, endNodeId); + return FindPathAStar(startNodeId, endNodeId); } // 첫 번째 경유지가 시작노드와 같은지 검사 @@ -267,7 +266,7 @@ namespace AGVNavigationCore.PathFinding.Core string waypoint = validWaypoints[i]; // 현재 위치에서 경유지까지의 경로 계산 - var segmentResult = FindPath(currentStart, waypoint); + var segmentResult = FindPathAStar(currentStart, waypoint); if (!segmentResult.Success) { @@ -295,7 +294,7 @@ namespace AGVNavigationCore.PathFinding.Core } // 2단계: 마지막 경유지에서 최종 목적지까지의 경로 계산 - var finalSegmentResult = FindPath(currentStart, endNodeId); + var finalSegmentResult = FindPathAStar(currentStart, endNodeId); if (!finalSegmentResult.Success) { @@ -442,7 +441,7 @@ namespace AGVNavigationCore.PathFinding.Core AGVPathResult bestResult = null; foreach (var targetId in targetNodeIds) { - var result = FindPath(startNodeId, targetId); + var result = FindPathAStar(startNodeId, targetId); if (result.Success && (bestResult == null || result.TotalDistance < bestResult.TotalDistance)) { bestResult = result; diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/PathFinding/Planning/AGVPathfinder.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/PathFinding/Planning/AGVPathfinder.cs index 76b37e2..a08392e 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/PathFinding/Planning/AGVPathfinder.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/PathFinding/Planning/AGVPathfinder.cs @@ -22,8 +22,6 @@ namespace AGVNavigationCore.PathFinding.Planning private readonly JunctionAnalyzer _junctionAnalyzer; private readonly DirectionChangePlanner _directionChangePlanner; - - public AGVPathfinder(List mapNodes) { _mapNodes = mapNodes ?? new List(); @@ -49,8 +47,9 @@ namespace AGVNavigationCore.PathFinding.Planning n.IsActive && n.IsNavigationNode() && n.ConnectedNodes != null && + n.DisableCross == false && n.ConnectedNodes.Count >= 3 && - n.ConnectedMapNodes.Where(t => t.Type == NodeType.Docking || t.Type == NodeType.Charging).Any() == false && + n.ConnectedMapNodes.Where(t => t.CanDocking).Any() == false && n.NodeId != startNode.NodeId ).ToList(); @@ -99,9 +98,10 @@ namespace AGVNavigationCore.PathFinding.Planning if (pathNode != null && pathNode.IsActive && pathNode.IsNavigationNode() && + pathNode.DisableCross == false && pathNode.ConnectedNodes != null && pathNode.ConnectedNodes.Count >= 3 && - pathNode.ConnectedMapNodes.Where(t => t.Type == NodeType.Docking || t.Type == NodeType.Charging).Any() == false) + pathNode.ConnectedMapNodes.Where(t => t.CanDocking).Any() == false) { if (pathNode.NodeId.Equals(StartNode.NodeId) == false) return pathNode; @@ -122,12 +122,12 @@ namespace AGVNavigationCore.PathFinding.Planning if (prevNode == null) return AGVPathResult.CreateFailure("이전위치 노드가 null입니다.", 0, 0); if (startNode.NodeId == targetNode.NodeId && targetNode.DockDirection.MatchAGVDirection(prevDirection)) - return AGVPathResult.CreateSuccess(new List { startNode,startNode }, new List(), 0, 0); + return AGVPathResult.CreateSuccess(new List { startNode, startNode }, new List(), 0, 0); var ReverseDirection = (currentDirection == AgvDirection.Forward ? AgvDirection.Backward : AgvDirection.Forward); //1.목적지까지의 최단거리 경로를 찾는다. - var pathResult = _basicPathfinder.FindPath(startNode.NodeId, targetNode.NodeId); + var pathResult = _basicPathfinder.FindPathAStar(startNode.NodeId, targetNode.NodeId); pathResult.PrevNode = prevNode; pathResult.PrevDirection = prevDirection; if (!pathResult.Success || pathResult.Path == null || pathResult.Path.Count == 0) @@ -221,7 +221,7 @@ namespace AGVNavigationCore.PathFinding.Planning //진행방향으로 이동했을때 나오는 노드를 사용한다. if (nextNodeForward != null) { - var Path0 = _basicPathfinder.FindPath(startNode.NodeId, nextNodeForward.NodeId); + var Path0 = _basicPathfinder.FindPathAStar(startNode.NodeId, nextNodeForward.NodeId); Path0.PrevNode = prevNode; Path0.PrevDirection = prevDirection; MakeDetailData(Path0, prevDirection); @@ -267,7 +267,7 @@ namespace AGVNavigationCore.PathFinding.Planning //경유지를 포함하여 경로를 다시 계산한다. //1.시작위치 - 교차로(여기까지는 현재 방향으로 그대로 이동을 한다) - var path1 = _basicPathfinder.FindPath(startNode.NodeId, JunctionInPath.NodeId); + var path1 = _basicPathfinder.FindPathAStar(startNode.NodeId, JunctionInPath.NodeId); path1.PrevNode = prevNode; path1.PrevDirection = prevDirection; @@ -295,7 +295,7 @@ namespace AGVNavigationCore.PathFinding.Planning //2.교차로 - 종료위치 - var path2 = _basicPathfinder.FindPath(JunctionInPath.NodeId, targetNode.NodeId); + var path2 = _basicPathfinder.FindPathAStar(JunctionInPath.NodeId, targetNode.NodeId); path2.PrevNode = prevNode; path2.PrevDirection = prevDirection; @@ -332,7 +332,7 @@ namespace AGVNavigationCore.PathFinding.Planning //if (tempNode != null) { // 교차로 → 대체노드 경로 계산 - var pathToTemp = _basicPathfinder.FindPath(JunctionInPath.NodeId, tempNode.NodeId); + var pathToTemp = _basicPathfinder.FindPathAStar(JunctionInPath.NodeId, tempNode.NodeId); pathToTemp.PrevNode = JunctionInPath; pathToTemp.PrevDirection = (ReverseCheck ? ReverseDirection : currentDirection); if (!pathToTemp.Success) @@ -348,7 +348,7 @@ namespace AGVNavigationCore.PathFinding.Planning combinedResult = _basicPathfinder.CombineResults(combinedResult, pathToTemp); // 대체노드 → 교차로 경로 계산 (역방향) - var pathFromTemp = _basicPathfinder.FindPath(tempNode.NodeId, JunctionInPath.NodeId); + var pathFromTemp = _basicPathfinder.FindPathAStar(tempNode.NodeId, JunctionInPath.NodeId); pathFromTemp.PrevNode = JunctionInPath; pathFromTemp.PrevDirection = (ReverseCheck ? ReverseDirection : currentDirection); if (!pathFromTemp.Success) @@ -362,7 +362,7 @@ namespace AGVNavigationCore.PathFinding.Planning //현재까지 노드에서 목적지까지의 방향이 일치하면 그대로 사용한다. bool temp3ok = false; - var TempCheck3 = _basicPathfinder.FindPath(combinedResult.Path.Last().NodeId, targetNode.NodeId); + var TempCheck3 = _basicPathfinder.FindPathAStar(combinedResult.Path.Last().NodeId, targetNode.NodeId); if (TempCheck3.Path.First().NodeId.Equals(combinedResult.Path.Last().NodeId)) { if (targetNode.DockDirection == DockingDirection.Forward && combinedResult.DetailedPath.Last().MotorDirection == AgvDirection.Forward) @@ -385,7 +385,7 @@ namespace AGVNavigationCore.PathFinding.Planning combinedResult.Path[combinedResult.Path.Count - 2].NodeId, path2.Path[1].NodeId); - var pathToTemp2 = _basicPathfinder.FindPath(JunctionInPath.NodeId, tempNode2.NodeId); + var pathToTemp2 = _basicPathfinder.FindPathAStar(JunctionInPath.NodeId, tempNode2.NodeId); if (ReverseCheck) MakeDetailData(pathToTemp2, currentDirection); else MakeDetailData(pathToTemp2, ReverseDirection); @@ -400,7 +400,7 @@ namespace AGVNavigationCore.PathFinding.Planning combinedResult.DetailedPath[combinedResult.DetailedPath.Count - 1].MotorDirection = currentDirection; } - var pathToTemp3 = _basicPathfinder.FindPath(tempNode2.NodeId, JunctionInPath.NodeId); + var pathToTemp3 = _basicPathfinder.FindPathAStar(tempNode2.NodeId, JunctionInPath.NodeId); if (ReverseCheck) MakeDetailData(pathToTemp3, ReverseDirection); else MakeDetailData(pathToTemp3, currentDirection); @@ -438,7 +438,7 @@ namespace AGVNavigationCore.PathFinding.Planning string nextNodeId = (i + 1 < path1.Path.Count) ? path1.Path[i + 1].NodeId : null; // 노드 정보 생성 (현재 방향 유지) - var nodeInfo = new NodeMotorInfo(i+1, + var nodeInfo = new NodeMotorInfo(i + 1, nodeId, RfidId, currentDirection, nextNodeId, diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/PathFinding/Planning/DirectionChangePlanner.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/PathFinding/Planning/DirectionChangePlanner.cs index 73c5167..fad50ee 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/PathFinding/Planning/DirectionChangePlanner.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/PathFinding/Planning/DirectionChangePlanner.cs @@ -73,7 +73,7 @@ namespace AGVNavigationCore.PathFinding.Planning // 방향이 같으면 직접 경로 계산 if (currentDirection == requiredDirection) { - var directPath = _pathfinder.FindPath(startNodeId, targetNodeId); + var directPath = _pathfinder.FindPathAStar(startNodeId, targetNodeId); if (directPath.Success) { return DirectionChangePlan.CreateSuccess( @@ -85,7 +85,7 @@ namespace AGVNavigationCore.PathFinding.Planning } // 방향 전환이 필요한 경우 - 먼저 간단한 직접 경로 확인 - var directPath2 = _pathfinder.FindPath(startNodeId, targetNodeId); + var directPath2 = _pathfinder.FindPathAStar(startNodeId, targetNodeId); if (directPath2.Success) { // 직접 경로에 갈림길이 포함된 경우 그 갈림길에서 방향 전환 @@ -160,7 +160,7 @@ namespace AGVNavigationCore.PathFinding.Planning } // 2. 직진 경로상의 갈림길들도 검색 (단, 되돌아가기 방지) - var directPath = _pathfinder.FindPath(startNodeId, targetNodeId); + var directPath = _pathfinder.FindPathAStar(startNodeId, targetNodeId); if (directPath.Success) { foreach (var node in directPath.Path.Skip(2)) // 시작점과 다음 노드는 제외 @@ -261,7 +261,7 @@ namespace AGVNavigationCore.PathFinding.Planning foreach (var junction in junctions) { - var path = _pathfinder.FindPath(startNodeId, junction); + var path = _pathfinder.FindPathAStar(startNodeId, junction); double distance = path.Success ? path.TotalDistance : double.MaxValue; distances.Add((junction, distance)); } @@ -313,12 +313,12 @@ namespace AGVNavigationCore.PathFinding.Planning var fullPath = new List(); // 1. 시작점에서 갈림길까지의 경로 - var toJunctionPath = _pathfinder.FindPath(startNodeId, junctionNodeId); + var toJunctionPath = _pathfinder.FindPathAStar(startNodeId, junctionNodeId); if (!toJunctionPath.Success) return fullPath; // 2. 인근 갈림길을 통한 우회인지, 직진 경로상 갈림길인지 판단 - var directPath = _pathfinder.FindPath(startNodeId, targetNodeId); + var directPath = _pathfinder.FindPathAStar(startNodeId, targetNodeId); bool isNearbyDetour = !directPath.Success || !directPath.Path.Any(n => n.NodeId == junctionNodeId); if (isNearbyDetour) @@ -341,7 +341,7 @@ namespace AGVNavigationCore.PathFinding.Planning var fullPath = new List(); // 1. 시작점에서 갈림길까지 직진 (현재 방향 유지) - var toJunctionPath = _pathfinder.FindPath(startNodeId, junctionNodeId); + var toJunctionPath = _pathfinder.FindPathAStar(startNodeId, junctionNodeId); if (!toJunctionPath.Success) return fullPath; @@ -349,7 +349,7 @@ namespace AGVNavigationCore.PathFinding.Planning // 2. 갈림길에서 방향 전환 후 목적지로 // 이때 마그넷 센서를 이용해 목적지 방향으로 진입 - var fromJunctionPath = _pathfinder.FindPath(junctionNodeId, targetNodeId); + var fromJunctionPath = _pathfinder.FindPathAStar(junctionNodeId, targetNodeId); if (fromJunctionPath.Success && fromJunctionPath.Path.Count > 1) { fullPath.AddRange(fromJunctionPath.Path.Skip(1)); // 중복 노드 제거 @@ -366,7 +366,7 @@ namespace AGVNavigationCore.PathFinding.Planning var fullPath = new List(); // 1. 시작점에서 갈림길까지의 경로 - var toJunctionPath = _pathfinder.FindPath(startNodeId, junctionNodeId); + var toJunctionPath = _pathfinder.FindPathAStar(startNodeId, junctionNodeId); if (!toJunctionPath.Success) return fullPath; @@ -387,7 +387,7 @@ namespace AGVNavigationCore.PathFinding.Planning // 3. 갈림길에서 목표점까지의 경로 string lastNode = fullPath.LastOrDefault()?.NodeId ?? junctionNodeId; - var fromJunctionPath = _pathfinder.FindPath(lastNode, targetNodeId); + var fromJunctionPath = _pathfinder.FindPathAStar(lastNode, targetNodeId); if (fromJunctionPath.Success && fromJunctionPath.Path.Count > 1) { fullPath.AddRange(fromJunctionPath.Path.Skip(1)); @@ -609,7 +609,7 @@ namespace AGVNavigationCore.PathFinding.Planning private bool CanReachTargetViaJunction(string junctionNodeId, string targetNodeId) { // 갈림길에서 목적지까지의 경로가 존재하는지 확인 - var pathToTarget = _pathfinder.FindPath(junctionNodeId, targetNodeId); + var pathToTarget = _pathfinder.FindPathAStar(junctionNodeId, targetNodeId); return pathToTarget.Success; } diff --git a/Cs_HMI/AGVLogic/AGVNavigationCore/Utils/DirectionalPathfinderTest.cs b/Cs_HMI/AGVLogic/AGVNavigationCore/Utils/DirectionalPathfinderTest.cs index 52e32ca..3eb2e5f 100644 --- a/Cs_HMI/AGVLogic/AGVNavigationCore/Utils/DirectionalPathfinderTest.cs +++ b/Cs_HMI/AGVLogic/AGVNavigationCore/Utils/DirectionalPathfinderTest.cs @@ -153,7 +153,7 @@ namespace AGVNavigationCore.Utils Console.WriteLine($"이름: {node.Name}"); Console.WriteLine($"위치: {node.Position}"); Console.WriteLine($"타입: {GetNodeTypeName(node.Type)}"); - Console.WriteLine($"회전 가능: {node.CanRotate}"); + Console.WriteLine($"TurnLeft/Right/교차로 : {(node.CanTurnLeft ? "O":"X")}/{(node.CanTurnRight ? "O" : "X")}/{(node.DisableCross ? "X" : "O")}"); Console.WriteLine($"활성: {node.IsActive}"); Console.WriteLine($"연결된 노드:"); diff --git a/Cs_HMI/AGVLogic/AGVSimulator/Forms/SimulatorForm.cs b/Cs_HMI/AGVLogic/AGVSimulator/Forms/SimulatorForm.cs index 39c20dd..cec4ccc 100644 --- a/Cs_HMI/AGVLogic/AGVSimulator/Forms/SimulatorForm.cs +++ b/Cs_HMI/AGVLogic/AGVSimulator/Forms/SimulatorForm.cs @@ -338,6 +338,17 @@ namespace AGVSimulator.Forms advancedResult.DockingValidation = DockingValidator.ValidateDockingDirection(advancedResult, _mapNodes); } + //마지막대상이 버퍼라면 시퀀스처리를 해야한다 + if(targetNode.Type == NodeType.Buffer) + { + var lastDetailPath = advancedResult.DetailedPath.Last(); + if(lastDetailPath.NodeId == targetNode.NodeId) + { + + } + } + + _simulatorCanvas.CurrentPath = advancedResult; _pathLengthLabel.Text = $"경로 길이: {advancedResult.TotalDistance:F1}"; _statusLabel.Text = $"경로 계산 완료 ({advancedResult.CalculationTimeMs}ms)"; @@ -1443,7 +1454,7 @@ namespace AGVSimulator.Forms // 도킹 타겟 노드 찾기 var dockingTargets = _mapNodes.Where(n => - n.Type == NodeType.Charging || n.Type == NodeType.Docking).ToList(); + n.Type == NodeType.Charging || n.Type == NodeType.Loader || n.Type == NodeType.UnLoader || n.Type == NodeType.Clearner || n.Type == NodeType.Buffer).ToList(); if (dockingTargets.Count == 0) { diff --git a/Cs_HMI/Data/NewMap.agvmap b/Cs_HMI/Data/NewMap.agvmap index f2c9084..48daf5c 100644 --- a/Cs_HMI/Data/NewMap.agvmap +++ b/Cs_HMI/Data/NewMap.agvmap @@ -9,11 +9,13 @@ "ConnectedNodes": [ "N002" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", - "StationType": null, + "StationType": 3, "CreatedDate": "2025-09-11T08:34:44.9548285+09:00", - "ModifiedDate": "2025-12-08T11:54:03.1730939+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Red", "RfidId": "0001", @@ -47,11 +49,13 @@ "N003", "N001" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T08:34:48.2957516+09:00", - "ModifiedDate": "2025-12-08T11:54:05.9083675+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0002", @@ -85,11 +89,13 @@ "N004", "N002" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T08:34:49.2226656+09:00", - "ModifiedDate": "2025-12-08T11:54:07.7966472+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0003", @@ -125,11 +131,13 @@ "N011", "N003" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T08:34:50.1681027+09:00", - "ModifiedDate": "2025-12-08T11:54:09.4014966+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0004", @@ -163,11 +171,13 @@ "N007", "N022" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T08:34:51.1111368+09:00", - "ModifiedDate": "2025-12-08T11:54:49.3718611+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0013", @@ -201,11 +211,13 @@ "N019", "N006" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T08:34:51.9266982+09:00", - "ModifiedDate": "2025-12-08T11:54:51.4185821+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0014", @@ -239,11 +251,13 @@ "N009", "N031" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T08:34:53.9595825+09:00", - "ModifiedDate": "2025-12-08T11:54:13.626916+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0009", @@ -277,11 +291,13 @@ "N010", "N008" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T08:34:54.5035702+09:00", - "ModifiedDate": "2025-12-08T11:54:15.2395639+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0010", @@ -314,11 +330,13 @@ "ConnectedNodes": [ "N009" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", - "StationType": null, + "StationType": 2, "CreatedDate": "2025-09-11T08:34:55.0563237+09:00", - "ModifiedDate": "2025-12-08T11:54:17.075895+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Red", "RfidId": "0011", @@ -353,11 +371,13 @@ "N015", "N004" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T08:34:55.8875335+09:00", - "ModifiedDate": "2025-12-08T11:54:30.5451017+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0005", @@ -391,11 +411,13 @@ "N013", "N011" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T08:34:56.3678144+09:00", - "ModifiedDate": "2025-12-08T11:54:32.3566504+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0006", @@ -429,11 +451,13 @@ "N014", "N012" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T08:34:56.8390845+09:00", - "ModifiedDate": "2025-12-08T11:54:34.1608589+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0007", @@ -466,11 +490,13 @@ "ConnectedNodes": [ "N013" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", - "StationType": null, + "StationType": 1, "CreatedDate": "2025-09-11T08:34:57.2549726+09:00", - "ModifiedDate": "2025-12-08T11:54:36.2103863+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Red", "RfidId": "0008", @@ -503,11 +529,13 @@ "ConnectedNodes": [ "N007" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", - "StationType": null, + "StationType": 5, "CreatedDate": "2025-09-11T08:35:56.5359098+09:00", - "ModifiedDate": "2025-12-08T11:54:53.4706808+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Magenta", "RfidId": "0015", @@ -542,11 +570,13 @@ "N004", "N006" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T08:36:48.0311551+09:00", - "ModifiedDate": "2025-12-08T11:54:47.1279261+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0012", @@ -580,11 +610,13 @@ "N024", "N022" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T09:41:36.8738794+09:00", - "ModifiedDate": "2025-12-08T11:55:02.2993636+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0016", @@ -618,11 +650,13 @@ "N025", "N023" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T09:41:37.4551853+09:00", - "ModifiedDate": "2025-12-08T11:55:00.0899323+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0017", @@ -656,11 +690,13 @@ "N026", "N024" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T09:41:38.0142374+09:00", - "ModifiedDate": "2025-12-08T11:54:57.8459375+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0018", @@ -693,11 +729,13 @@ "ConnectedNodes": [ "N025" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", - "StationType": null, + "StationType": 5, "CreatedDate": "2025-09-11T09:41:38.5834487+09:00", - "ModifiedDate": "2025-12-08T11:54:55.6038784+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Magenta", "RfidId": "0019", @@ -728,11 +766,13 @@ "Type": 4, "DockDirection": 0, "ConnectedNodes": [], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T11:08:22.4048927+09:00", - "ModifiedDate": "2025-10-30T17:14:35.0184087+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Purple", "RfidId": "", @@ -763,11 +803,13 @@ "Type": 5, "DockDirection": 0, "ConnectedNodes": [], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", "StationType": null, "CreatedDate": "2025-09-11T11:08:44.7897541+09:00", - "ModifiedDate": "2025-10-23T12:21:16.7786615+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Brown", "RfidId": "", @@ -801,11 +843,13 @@ "N016", "N011" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-12T17:22:47.8065756+09:00", - "ModifiedDate": "2025-12-08T11:54:28.0157957+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0037", @@ -839,11 +883,13 @@ "N017", "N015" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-12T17:22:48.6628848+09:00", - "ModifiedDate": "2025-12-08T11:54:26.4584771+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0036", @@ -877,11 +923,13 @@ "N018", "N016" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-12T17:22:49.8138877+09:00", - "ModifiedDate": "2025-12-08T11:54:24.9652264+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0035", @@ -916,11 +964,13 @@ "N017", "N005" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", "StationType": null, "CreatedDate": "2025-09-12T17:22:50.6790623+09:00", - "ModifiedDate": "2025-12-08T11:54:23.246666+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0034", @@ -955,11 +1005,13 @@ "N029", "N018" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", "StationType": null, "CreatedDate": "2025-09-12T17:22:51.5267199+09:00", - "ModifiedDate": "2025-12-08T11:54:21.6078399+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0033", @@ -994,11 +1046,13 @@ "N028", "N005" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", "StationType": null, "CreatedDate": "2025-09-12T17:22:52.3666114+09:00", - "ModifiedDate": "2025-12-08T11:54:20.2707567+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0032", @@ -1032,11 +1086,13 @@ "N027", "N020" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", "StationType": null, "CreatedDate": "2025-09-12T17:22:53.0958619+09:00", - "ModifiedDate": "2025-12-08T11:54:18.362104+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0031", @@ -1069,11 +1125,13 @@ "ConnectedNodes": [ "N021" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", - "StationType": null, + "StationType": 4, "CreatedDate": "2025-09-12T17:22:54.7345704+09:00", - "ModifiedDate": "2025-12-08T11:54:43.1573737+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Green", "RfidId": "0041", @@ -1106,11 +1164,13 @@ "ConnectedNodes": [ "N020" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", - "StationType": null, + "StationType": 4, "CreatedDate": "2025-09-12T17:22:55.5263512+09:00", - "ModifiedDate": "2025-12-08T11:54:41.5219283+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Green", "RfidId": "0040", @@ -1143,11 +1203,13 @@ "ConnectedNodes": [ "N005" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", - "StationType": null, + "StationType": 4, "CreatedDate": "2025-09-12T17:22:56.6623294+09:00", - "ModifiedDate": "2025-12-08T11:54:39.9945926+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Green", "RfidId": "0039", @@ -1180,11 +1242,13 @@ "ConnectedNodes": [ "N018" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": true, "StationId": "", - "StationType": null, + "StationType": 4, "CreatedDate": "2025-09-12T17:22:57.5510908+09:00", - "ModifiedDate": "2025-12-08T11:54:38.3326835+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Green", "RfidId": "0038", @@ -1218,11 +1282,13 @@ "N004", "N008" ], - "CanRotate": false, + "CanTurnLeft": true, + "CanTurnRight": true, + "DisableCross": false, "StationId": "", "StationType": null, "CreatedDate": "2025-09-15T11:18:40.5366059+09:00", - "ModifiedDate": "2025-12-08T11:54:12.0214781+09:00", + "ModifiedDate": "2025-12-09T08:41:57.1293017+09:00", "IsActive": true, "DisplayColor": "Cyan", "RfidId": "0030", @@ -1251,6 +1317,6 @@ "BackgroundColorArgb": -14671840, "ShowGrid": false }, - "CreatedDate": "2025-12-08T11:55:04.9060276+09:00", + "CreatedDate": "2025-12-09T11:45:02.0324252+09:00", "Version": "1.1" } \ No newline at end of file diff --git a/Cs_HMI/Project/CSetting.cs b/Cs_HMI/Project/CSetting.cs index 367c99c..ec3bb6b 100644 --- a/Cs_HMI/Project/CSetting.cs +++ b/Cs_HMI/Project/CSetting.cs @@ -246,6 +246,11 @@ namespace Project public bool AutoModeOffAndClearPosition { get; set; } + + [Browsable(false)] + public UInt16 GDSValue { get; set; } + + [Browsable(false)] public string musicfile { get; set; } @@ -366,6 +371,7 @@ namespace Project if (StatusInterval < 10) StatusInterval = 300; //5분간격 if (XBE_ID < 1) XBE_ID = 0xFF; //0은 acs 이므로 쓰지못하게한다. if (SAD == 0) SAD = 999; + if (GDSValue == 0) GDSValue = 1000; if (TAGF1A == 0) { TAGNOT = 9000; diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_SYNC.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_SYNC.cs index 5d083a1..109c00d 100644 --- a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_SYNC.cs +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_SYNC.cs @@ -79,6 +79,10 @@ namespace Project synlist.Add("STT", PUB.setting.STT.ToString("0000")); //synlist.Add("SBN", PUB.setting.ChargerID.ToString("0000")); + synlist.Add("SGS", PUB.setting.GDSValue.ToString("0000")); + + + PUB.AddEEDB($"SYNC시작({PUB.Result.TargetPos})"); synidx = 0; diff --git a/Cs_HMI/Project/StateMachine/_AGV.cs b/Cs_HMI/Project/StateMachine/_AGV.cs index 7e74ecb..526b332 100644 --- a/Cs_HMI/Project/StateMachine/_AGV.cs +++ b/Cs_HMI/Project/StateMachine/_AGV.cs @@ -197,7 +197,7 @@ namespace Project NodeId = newNodeId, RfidId = PUB.Result.LastTAG, Name = $"자동추가_{PUB.Result.LastTAG}", - Type = NodeType.Normal, + Type = NodeType.Normal, Position = new Point(100, 100), // 기본 위치 IsActive = true, DisplayColor = Color.Orange, // 자동 추가된 노드는 오렌지색으로 표시 diff --git a/Cs_HMI/Project/ViewForm/fAgv.cs b/Cs_HMI/Project/ViewForm/fAgv.cs index b262f01..2ee59b6 100644 --- a/Cs_HMI/Project/ViewForm/fAgv.cs +++ b/Cs_HMI/Project/ViewForm/fAgv.cs @@ -138,7 +138,10 @@ namespace Project.ViewForm private void button9_Click(object sender, EventArgs e) { - PUB.AGV.TurnGDSCenterScope(); + var inputbox = AR.UTIL.InputBox("input value", "1000"); + if (inputbox.Item1 == false) return; + if (UInt16.TryParse(inputbox.Item2, out UInt16 value) == false) return; + PUB.AGV.TurnGDSCenterScope(value); if (PUB.sm.Step == StateMachine.eSMStep.RUN) PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); } diff --git a/Cs_HMI/Project/ViewForm/fManual.Designer.cs b/Cs_HMI/Project/ViewForm/fManual.Designer.cs index 78998e8..eb46ea4 100644 --- a/Cs_HMI/Project/ViewForm/fManual.Designer.cs +++ b/Cs_HMI/Project/ViewForm/fManual.Designer.cs @@ -41,46 +41,45 @@ this.btErrReset = new System.Windows.Forms.Button(); this.timer1 = new System.Windows.Forms.Timer(this.components); this.panel2 = new System.Windows.Forms.Panel(); - this.groupBox3 = new System.Windows.Forms.GroupBox(); - this.btBack180 = new System.Windows.Forms.Button(); - this.panel1 = new System.Windows.Forms.Panel(); this.btRight180 = new System.Windows.Forms.Button(); - this.panel10 = new System.Windows.Forms.Panel(); this.btLeft180 = new System.Windows.Forms.Button(); this.button1 = new System.Windows.Forms.Button(); this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.radpbs2 = new AGVControl.MyRadioButton(); this.panel9 = new System.Windows.Forms.Panel(); - this.radpbs1 = new AGVControl.MyRadioButton(); this.panel3 = new System.Windows.Forms.Panel(); - this.radpbs0 = new AGVControl.MyRadioButton(); this.grpSpeed = new System.Windows.Forms.GroupBox(); - this.radspdh = new AGVControl.MyRadioButton(); this.panel8 = new System.Windows.Forms.Panel(); - this.radspdm = new AGVControl.MyRadioButton(); this.panel4 = new System.Windows.Forms.Panel(); - this.radspdl = new AGVControl.MyRadioButton(); this.grpBunki = new System.Windows.Forms.GroupBox(); - this.radright = new AGVControl.MyRadioButton(); this.panel7 = new System.Windows.Forms.Panel(); - this.radstrai = new AGVControl.MyRadioButton(); this.panel5 = new System.Windows.Forms.Panel(); - this.radleft = new AGVControl.MyRadioButton(); this.groupBox2 = new System.Windows.Forms.GroupBox(); this.arLabel1 = new arCtl.arLabel(); this.panel12 = new System.Windows.Forms.Panel(); - this.radbackward = new AGVControl.MyRadioButton(); this.panel6 = new System.Windows.Forms.Panel(); - this.radforward = new AGVControl.MyRadioButton(); this.label1 = new System.Windows.Forms.Label(); + this.radpbs2 = new AGVControl.MyRadioButton(); + this.radpbs1 = new AGVControl.MyRadioButton(); + this.radpbs0 = new AGVControl.MyRadioButton(); + this.radspdh = new AGVControl.MyRadioButton(); + this.radspdm = new AGVControl.MyRadioButton(); + this.radspdl = new AGVControl.MyRadioButton(); + this.radright = new AGVControl.MyRadioButton(); + this.radstrai = new AGVControl.MyRadioButton(); + this.radleft = new AGVControl.MyRadioButton(); + this.radbackward = new AGVControl.MyRadioButton(); + this.radforward = new AGVControl.MyRadioButton(); this.guideSensor1 = new Narumi.UC.GuideSensor(); + this.btBack180 = new System.Windows.Forms.Button(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.button2 = new System.Windows.Forms.Button(); this.tableLayoutPanel1.SuspendLayout(); this.panel2.SuspendLayout(); - this.groupBox3.SuspendLayout(); this.groupBox1.SuspendLayout(); this.grpSpeed.SuspendLayout(); this.grpBunki.SuspendLayout(); this.groupBox2.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); this.SuspendLayout(); // // tableLayoutPanel1 @@ -105,7 +104,7 @@ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(604, 555); + this.tableLayoutPanel1.Size = new System.Drawing.Size(604, 594); this.tableLayoutPanel1.TabIndex = 7; // // btStart @@ -125,7 +124,7 @@ this.btStart.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; this.btStart.GradientRepeatBG = false; this.btStart.isButton = true; - this.btStart.Location = new System.Drawing.Point(204, 188); + this.btStart.Location = new System.Drawing.Point(204, 201); this.btStart.MouseDownColor = System.Drawing.Color.Yellow; this.btStart.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.btStart.msg = new string[] { @@ -147,7 +146,7 @@ this.btStart.SignAlign = System.Drawing.ContentAlignment.BottomRight; this.btStart.SignColor = System.Drawing.Color.Yellow; this.btStart.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); - this.btStart.Size = new System.Drawing.Size(195, 179); + this.btStart.Size = new System.Drawing.Size(195, 192); this.btStart.TabIndex = 6; this.btStart.Text = "RUN"; this.btStart.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -172,7 +171,7 @@ this.btRight.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; this.btRight.GradientRepeatBG = false; this.btRight.isButton = true; - this.btRight.Location = new System.Drawing.Point(405, 188); + this.btRight.Location = new System.Drawing.Point(405, 201); this.btRight.MouseDownColor = System.Drawing.Color.Yellow; this.btRight.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.btRight.msg = null; @@ -192,7 +191,7 @@ this.btRight.SignAlign = System.Drawing.ContentAlignment.BottomRight; this.btRight.SignColor = System.Drawing.Color.Yellow; this.btRight.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); - this.btRight.Size = new System.Drawing.Size(196, 179); + this.btRight.Size = new System.Drawing.Size(196, 192); this.btRight.TabIndex = 0; this.btRight.Text = "좌회전"; this.btRight.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -238,7 +237,7 @@ this.btBack.SignAlign = System.Drawing.ContentAlignment.BottomRight; this.btBack.SignColor = System.Drawing.Color.Yellow; this.btBack.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); - this.btBack.Size = new System.Drawing.Size(195, 179); + this.btBack.Size = new System.Drawing.Size(195, 192); this.btBack.TabIndex = 0; this.btBack.Text = "후진"; this.btBack.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -263,7 +262,7 @@ this.btForward.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; this.btForward.GradientRepeatBG = false; this.btForward.isButton = true; - this.btForward.Location = new System.Drawing.Point(204, 373); + this.btForward.Location = new System.Drawing.Point(204, 399); this.btForward.MouseDownColor = System.Drawing.Color.Yellow; this.btForward.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.btForward.msg = null; @@ -283,7 +282,7 @@ this.btForward.SignAlign = System.Drawing.ContentAlignment.BottomRight; this.btForward.SignColor = System.Drawing.Color.Yellow; this.btForward.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); - this.btForward.Size = new System.Drawing.Size(195, 179); + this.btForward.Size = new System.Drawing.Size(195, 192); this.btForward.TabIndex = 0; this.btForward.Text = "전진"; this.btForward.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -308,7 +307,7 @@ this.btLeft.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; this.btLeft.GradientRepeatBG = false; this.btLeft.isButton = true; - this.btLeft.Location = new System.Drawing.Point(3, 188); + this.btLeft.Location = new System.Drawing.Point(3, 201); this.btLeft.MouseDownColor = System.Drawing.Color.Yellow; this.btLeft.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.btLeft.msg = null; @@ -328,7 +327,7 @@ this.btLeft.SignAlign = System.Drawing.ContentAlignment.BottomRight; this.btLeft.SignColor = System.Drawing.Color.Yellow; this.btLeft.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); - this.btLeft.Size = new System.Drawing.Size(195, 179); + this.btLeft.Size = new System.Drawing.Size(195, 192); this.btLeft.TabIndex = 0; this.btLeft.Text = "우회전"; this.btLeft.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -342,7 +341,7 @@ this.btMarkStop.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); this.btMarkStop.Location = new System.Drawing.Point(3, 3); this.btMarkStop.Name = "btMarkStop"; - this.btMarkStop.Size = new System.Drawing.Size(195, 179); + this.btMarkStop.Size = new System.Drawing.Size(195, 192); this.btMarkStop.TabIndex = 7; this.btMarkStop.Text = "마크정지"; this.btMarkStop.UseVisualStyleBackColor = true; @@ -352,9 +351,9 @@ // this.btchargeOff.Dock = System.Windows.Forms.DockStyle.Fill; this.btchargeOff.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.btchargeOff.Location = new System.Drawing.Point(405, 373); + this.btchargeOff.Location = new System.Drawing.Point(405, 399); this.btchargeOff.Name = "btchargeOff"; - this.btchargeOff.Size = new System.Drawing.Size(196, 179); + this.btchargeOff.Size = new System.Drawing.Size(196, 192); this.btchargeOff.TabIndex = 8; this.btchargeOff.Text = "충전해제"; this.btchargeOff.UseVisualStyleBackColor = true; @@ -364,9 +363,9 @@ // this.btChargeOn.Dock = System.Windows.Forms.DockStyle.Fill; this.btChargeOn.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.btChargeOn.Location = new System.Drawing.Point(3, 373); + this.btChargeOn.Location = new System.Drawing.Point(3, 399); this.btChargeOn.Name = "btChargeOn"; - this.btChargeOn.Size = new System.Drawing.Size(195, 179); + this.btChargeOn.Size = new System.Drawing.Size(195, 192); this.btChargeOn.TabIndex = 9; this.btChargeOn.Text = "충전"; this.btChargeOn.UseVisualStyleBackColor = true; @@ -378,7 +377,7 @@ this.btErrReset.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); this.btErrReset.Location = new System.Drawing.Point(405, 3); this.btErrReset.Name = "btErrReset"; - this.btErrReset.Size = new System.Drawing.Size(196, 179); + this.btErrReset.Size = new System.Drawing.Size(196, 192); this.btErrReset.TabIndex = 10; this.btErrReset.Text = "오류소거"; this.btErrReset.UseVisualStyleBackColor = true; @@ -391,7 +390,7 @@ // // panel2 // - this.panel2.Controls.Add(this.groupBox3); + this.panel2.Controls.Add(this.tableLayoutPanel2); this.panel2.Controls.Add(this.button1); this.panel2.Controls.Add(this.groupBox1); this.panel2.Controls.Add(this.grpSpeed); @@ -400,79 +399,33 @@ this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; this.panel2.Location = new System.Drawing.Point(607, 21); this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(404, 517); + this.panel2.Size = new System.Drawing.Size(404, 556); this.panel2.TabIndex = 9; this.panel2.Paint += new System.Windows.Forms.PaintEventHandler(this.panel2_Paint); // - // groupBox3 - // - this.groupBox3.Controls.Add(this.btBack180); - this.groupBox3.Controls.Add(this.panel1); - this.groupBox3.Controls.Add(this.btRight180); - this.groupBox3.Controls.Add(this.panel10); - this.groupBox3.Controls.Add(this.btLeft180); - this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill; - this.groupBox3.Location = new System.Drawing.Point(0, 450); - this.groupBox3.Name = "groupBox3"; - this.groupBox3.Padding = new System.Windows.Forms.Padding(10, 5, 5, 10); - this.groupBox3.Size = new System.Drawing.Size(404, 67); - this.groupBox3.TabIndex = 11; - this.groupBox3.TabStop = false; - // - // btBack180 - // - this.btBack180.BackColor = System.Drawing.Color.WhiteSmoke; - this.btBack180.Cursor = System.Windows.Forms.Cursors.Hand; - this.btBack180.Dock = System.Windows.Forms.DockStyle.Fill; - this.btBack180.Font = new System.Drawing.Font("맑은 고딕", 10F, System.Drawing.FontStyle.Bold); - this.btBack180.ForeColor = System.Drawing.Color.Black; - this.btBack180.Location = new System.Drawing.Point(270, 19); - this.btBack180.Name = "btBack180"; - this.btBack180.Size = new System.Drawing.Size(129, 38); - this.btBack180.TabIndex = 15; - this.btBack180.Text = "백후 180도 회전"; - this.btBack180.UseVisualStyleBackColor = false; - this.btBack180.Click += new System.EventHandler(this.btBack180_Click); - // - // panel1 - // - this.panel1.Dock = System.Windows.Forms.DockStyle.Left; - this.panel1.Location = new System.Drawing.Point(261, 19); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(9, 38); - this.panel1.TabIndex = 14; - // // btRight180 // this.btRight180.BackColor = System.Drawing.Color.WhiteSmoke; - this.btRight180.Dock = System.Windows.Forms.DockStyle.Left; + this.btRight180.Dock = System.Windows.Forms.DockStyle.Fill; this.btRight180.Font = new System.Drawing.Font("맑은 고딕", 10F, System.Drawing.FontStyle.Bold); this.btRight180.ForeColor = System.Drawing.Color.Black; - this.btRight180.Location = new System.Drawing.Point(140, 19); + this.btRight180.Location = new System.Drawing.Point(3, 62); this.btRight180.Name = "btRight180"; - this.btRight180.Size = new System.Drawing.Size(121, 38); + this.btRight180.Size = new System.Drawing.Size(196, 53); this.btRight180.TabIndex = 6; this.btRight180.Text = "180도 우회전"; this.btRight180.UseVisualStyleBackColor = false; this.btRight180.Click += new System.EventHandler(this.btRight180_Click); // - // panel10 - // - this.panel10.Dock = System.Windows.Forms.DockStyle.Left; - this.panel10.Location = new System.Drawing.Point(131, 19); - this.panel10.Name = "panel10"; - this.panel10.Size = new System.Drawing.Size(9, 38); - this.panel10.TabIndex = 12; - // // btLeft180 // this.btLeft180.BackColor = System.Drawing.Color.WhiteSmoke; - this.btLeft180.Dock = System.Windows.Forms.DockStyle.Left; + this.btLeft180.Dock = System.Windows.Forms.DockStyle.Fill; this.btLeft180.Font = new System.Drawing.Font("맑은 고딕", 10F, System.Drawing.FontStyle.Bold); this.btLeft180.ForeColor = System.Drawing.Color.Black; - this.btLeft180.Location = new System.Drawing.Point(10, 19); + this.btLeft180.Location = new System.Drawing.Point(3, 3); this.btLeft180.Name = "btLeft180"; - this.btLeft180.Size = new System.Drawing.Size(121, 38); + this.btLeft180.Size = new System.Drawing.Size(196, 53); this.btLeft180.TabIndex = 7; this.btLeft180.Text = "180도 좌회전"; this.btLeft180.UseVisualStyleBackColor = false; @@ -484,7 +437,7 @@ this.button1.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); this.button1.Location = new System.Drawing.Point(0, 380); this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(404, 70); + this.button1.Size = new System.Drawing.Size(404, 58); this.button1.TabIndex = 10; this.button1.Text = "설정 적용"; this.button1.UseVisualStyleBackColor = true; @@ -506,25 +459,6 @@ this.groupBox1.TabStop = false; this.groupBox1.Text = "근접센서(PBS)"; // - // radpbs2 - // - this.radpbs2.BackColor = System.Drawing.Color.WhiteSmoke; - this.radpbs2.Bordercolor = System.Drawing.Color.DimGray; - this.radpbs2.BorderRadius = 7; - this.radpbs2.BorderSize = 2; - this.radpbs2.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.radpbs2.CheckOnColor = System.Drawing.Color.LimeGreen; - this.radpbs2.CheckWidth = 30; - this.radpbs2.Dock = System.Windows.Forms.DockStyle.Left; - this.radpbs2.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.radpbs2.Location = new System.Drawing.Point(278, 19); - this.radpbs2.Name = "radpbs2"; - this.radpbs2.Size = new System.Drawing.Size(119, 66); - this.radpbs2.TabIndex = 10; - this.radpbs2.Text = "On(2)"; - this.radpbs2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - this.radpbs2.UseVisualStyleBackColor = false; - // // panel9 // this.panel9.Dock = System.Windows.Forms.DockStyle.Left; @@ -533,28 +467,6 @@ this.panel9.Size = new System.Drawing.Size(15, 66); this.panel9.TabIndex = 12; // - // radpbs1 - // - this.radpbs1.BackColor = System.Drawing.Color.WhiteSmoke; - this.radpbs1.Bordercolor = System.Drawing.Color.DimGray; - this.radpbs1.BorderRadius = 7; - this.radpbs1.BorderSize = 2; - this.radpbs1.Checked = true; - this.radpbs1.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.radpbs1.CheckOnColor = System.Drawing.Color.LimeGreen; - this.radpbs1.CheckWidth = 30; - this.radpbs1.Dock = System.Windows.Forms.DockStyle.Left; - this.radpbs1.Font = new System.Drawing.Font("맑은 고딕", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.radpbs1.ForeColor = System.Drawing.Color.Blue; - this.radpbs1.Location = new System.Drawing.Point(144, 19); - this.radpbs1.Name = "radpbs1"; - this.radpbs1.Size = new System.Drawing.Size(119, 66); - this.radpbs1.TabIndex = 9; - this.radpbs1.TabStop = true; - this.radpbs1.Text = "On(1)"; - this.radpbs1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - this.radpbs1.UseVisualStyleBackColor = false; - // // panel3 // this.panel3.Dock = System.Windows.Forms.DockStyle.Left; @@ -563,25 +475,6 @@ this.panel3.Size = new System.Drawing.Size(15, 66); this.panel3.TabIndex = 11; // - // radpbs0 - // - this.radpbs0.BackColor = System.Drawing.Color.WhiteSmoke; - this.radpbs0.Bordercolor = System.Drawing.Color.DimGray; - this.radpbs0.BorderRadius = 7; - this.radpbs0.BorderSize = 2; - this.radpbs0.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.radpbs0.CheckOnColor = System.Drawing.Color.LimeGreen; - this.radpbs0.CheckWidth = 30; - this.radpbs0.Dock = System.Windows.Forms.DockStyle.Left; - this.radpbs0.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.radpbs0.Location = new System.Drawing.Point(10, 19); - this.radpbs0.Name = "radpbs0"; - this.radpbs0.Size = new System.Drawing.Size(119, 66); - this.radpbs0.TabIndex = 8; - this.radpbs0.Text = "Off(0)"; - this.radpbs0.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - this.radpbs0.UseVisualStyleBackColor = false; - // // grpSpeed // this.grpSpeed.Controls.Add(this.radspdh); @@ -598,25 +491,6 @@ this.grpSpeed.TabStop = false; this.grpSpeed.Text = "속도"; // - // radspdh - // - this.radspdh.BackColor = System.Drawing.Color.WhiteSmoke; - this.radspdh.Bordercolor = System.Drawing.Color.DimGray; - this.radspdh.BorderRadius = 7; - this.radspdh.BorderSize = 2; - this.radspdh.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.radspdh.CheckOnColor = System.Drawing.Color.LimeGreen; - this.radspdh.CheckWidth = 30; - this.radspdh.Dock = System.Windows.Forms.DockStyle.Left; - this.radspdh.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.radspdh.Location = new System.Drawing.Point(278, 19); - this.radspdh.Name = "radspdh"; - this.radspdh.Size = new System.Drawing.Size(119, 66); - this.radspdh.TabIndex = 2; - this.radspdh.Text = "고속"; - this.radspdh.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - this.radspdh.UseVisualStyleBackColor = false; - // // panel8 // this.panel8.Dock = System.Windows.Forms.DockStyle.Left; @@ -625,28 +499,6 @@ this.panel8.Size = new System.Drawing.Size(15, 66); this.panel8.TabIndex = 13; // - // radspdm - // - this.radspdm.BackColor = System.Drawing.Color.WhiteSmoke; - this.radspdm.Bordercolor = System.Drawing.Color.DimGray; - this.radspdm.BorderRadius = 7; - this.radspdm.BorderSize = 2; - this.radspdm.Checked = true; - this.radspdm.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.radspdm.CheckOnColor = System.Drawing.Color.LimeGreen; - this.radspdm.CheckWidth = 30; - this.radspdm.Dock = System.Windows.Forms.DockStyle.Left; - this.radspdm.Font = new System.Drawing.Font("맑은 고딕", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.radspdm.ForeColor = System.Drawing.Color.Blue; - this.radspdm.Location = new System.Drawing.Point(144, 19); - this.radspdm.Name = "radspdm"; - this.radspdm.Size = new System.Drawing.Size(119, 66); - this.radspdm.TabIndex = 1; - this.radspdm.TabStop = true; - this.radspdm.Text = "중속"; - this.radspdm.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - this.radspdm.UseVisualStyleBackColor = false; - // // panel4 // this.panel4.Dock = System.Windows.Forms.DockStyle.Left; @@ -655,25 +507,6 @@ this.panel4.Size = new System.Drawing.Size(15, 66); this.panel4.TabIndex = 12; // - // radspdl - // - this.radspdl.BackColor = System.Drawing.Color.WhiteSmoke; - this.radspdl.Bordercolor = System.Drawing.Color.DimGray; - this.radspdl.BorderRadius = 7; - this.radspdl.BorderSize = 2; - this.radspdl.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.radspdl.CheckOnColor = System.Drawing.Color.LimeGreen; - this.radspdl.CheckWidth = 30; - this.radspdl.Dock = System.Windows.Forms.DockStyle.Left; - this.radspdl.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.radspdl.Location = new System.Drawing.Point(10, 19); - this.radspdl.Name = "radspdl"; - this.radspdl.Size = new System.Drawing.Size(119, 66); - this.radspdl.TabIndex = 0; - this.radspdl.Text = "저속"; - this.radspdl.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - this.radspdl.UseVisualStyleBackColor = false; - // // grpBunki // this.grpBunki.Controls.Add(this.radright); @@ -690,25 +523,6 @@ this.grpBunki.TabStop = false; this.grpBunki.Text = "분기"; // - // radright - // - this.radright.BackColor = System.Drawing.Color.WhiteSmoke; - this.radright.Bordercolor = System.Drawing.Color.DimGray; - this.radright.BorderRadius = 7; - this.radright.BorderSize = 2; - this.radright.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.radright.CheckOnColor = System.Drawing.Color.LimeGreen; - this.radright.CheckWidth = 30; - this.radright.Dock = System.Windows.Forms.DockStyle.Left; - this.radright.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.radright.Location = new System.Drawing.Point(278, 19); - this.radright.Name = "radright"; - this.radright.Size = new System.Drawing.Size(119, 66); - this.radright.TabIndex = 4; - this.radright.Text = "우측"; - this.radright.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - this.radright.UseVisualStyleBackColor = false; - // // panel7 // this.panel7.Dock = System.Windows.Forms.DockStyle.Left; @@ -717,28 +531,6 @@ this.panel7.Size = new System.Drawing.Size(15, 66); this.panel7.TabIndex = 13; // - // radstrai - // - this.radstrai.BackColor = System.Drawing.Color.WhiteSmoke; - this.radstrai.Bordercolor = System.Drawing.Color.DimGray; - this.radstrai.BorderRadius = 7; - this.radstrai.BorderSize = 2; - this.radstrai.Checked = true; - this.radstrai.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.radstrai.CheckOnColor = System.Drawing.Color.LimeGreen; - this.radstrai.CheckWidth = 30; - this.radstrai.Dock = System.Windows.Forms.DockStyle.Left; - this.radstrai.Font = new System.Drawing.Font("맑은 고딕", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.radstrai.ForeColor = System.Drawing.Color.Blue; - this.radstrai.Location = new System.Drawing.Point(144, 19); - this.radstrai.Name = "radstrai"; - this.radstrai.Size = new System.Drawing.Size(119, 66); - this.radstrai.TabIndex = 3; - this.radstrai.TabStop = true; - this.radstrai.Text = "직진"; - this.radstrai.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - this.radstrai.UseVisualStyleBackColor = false; - // // panel5 // this.panel5.Dock = System.Windows.Forms.DockStyle.Left; @@ -747,25 +539,6 @@ this.panel5.Size = new System.Drawing.Size(15, 66); this.panel5.TabIndex = 12; // - // radleft - // - this.radleft.BackColor = System.Drawing.Color.WhiteSmoke; - this.radleft.Bordercolor = System.Drawing.Color.DimGray; - this.radleft.BorderRadius = 7; - this.radleft.BorderSize = 2; - this.radleft.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.radleft.CheckOnColor = System.Drawing.Color.LimeGreen; - this.radleft.CheckWidth = 30; - this.radleft.Dock = System.Windows.Forms.DockStyle.Left; - this.radleft.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.radleft.Location = new System.Drawing.Point(10, 19); - this.radleft.Name = "radleft"; - this.radleft.Size = new System.Drawing.Size(119, 66); - this.radleft.TabIndex = 5; - this.radleft.Text = "좌측"; - this.radleft.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - this.radleft.UseVisualStyleBackColor = false; - // // groupBox2 // this.groupBox2.Controls.Add(this.arLabel1); @@ -837,6 +610,208 @@ this.panel12.Size = new System.Drawing.Size(15, 66); this.panel12.TabIndex = 14; // + // panel6 + // + this.panel6.Dock = System.Windows.Forms.DockStyle.Left; + this.panel6.Location = new System.Drawing.Point(129, 19); + this.panel6.Name = "panel6"; + this.panel6.Size = new System.Drawing.Size(15, 66); + this.panel6.TabIndex = 12; + // + // label1 + // + this.label1.BackColor = System.Drawing.Color.Blue; + this.label1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.label1.Font = new System.Drawing.Font("맑은 고딕", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(607, 577); + this.label1.Name = "label1"; + this.label1.Padding = new System.Windows.Forms.Padding(0, 3, 0, 3); + this.label1.Size = new System.Drawing.Size(404, 38); + this.label1.TabIndex = 9; + this.label1.Text = "----------"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // radpbs2 + // + this.radpbs2.BackColor = System.Drawing.Color.WhiteSmoke; + this.radpbs2.Bordercolor = System.Drawing.Color.DimGray; + this.radpbs2.BorderRadius = 7; + this.radpbs2.BorderSize = 2; + this.radpbs2.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radpbs2.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radpbs2.CheckWidth = 30; + this.radpbs2.Dock = System.Windows.Forms.DockStyle.Left; + this.radpbs2.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radpbs2.Location = new System.Drawing.Point(278, 19); + this.radpbs2.Name = "radpbs2"; + this.radpbs2.Size = new System.Drawing.Size(119, 66); + this.radpbs2.TabIndex = 10; + this.radpbs2.Text = "On(2)"; + this.radpbs2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radpbs2.UseVisualStyleBackColor = false; + // + // radpbs1 + // + this.radpbs1.BackColor = System.Drawing.Color.WhiteSmoke; + this.radpbs1.Bordercolor = System.Drawing.Color.DimGray; + this.radpbs1.BorderRadius = 7; + this.radpbs1.BorderSize = 2; + this.radpbs1.Checked = true; + this.radpbs1.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radpbs1.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radpbs1.CheckWidth = 30; + this.radpbs1.Dock = System.Windows.Forms.DockStyle.Left; + this.radpbs1.Font = new System.Drawing.Font("맑은 고딕", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radpbs1.ForeColor = System.Drawing.Color.Blue; + this.radpbs1.Location = new System.Drawing.Point(144, 19); + this.radpbs1.Name = "radpbs1"; + this.radpbs1.Size = new System.Drawing.Size(119, 66); + this.radpbs1.TabIndex = 9; + this.radpbs1.TabStop = true; + this.radpbs1.Text = "On(1)"; + this.radpbs1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radpbs1.UseVisualStyleBackColor = false; + // + // radpbs0 + // + this.radpbs0.BackColor = System.Drawing.Color.WhiteSmoke; + this.radpbs0.Bordercolor = System.Drawing.Color.DimGray; + this.radpbs0.BorderRadius = 7; + this.radpbs0.BorderSize = 2; + this.radpbs0.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radpbs0.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radpbs0.CheckWidth = 30; + this.radpbs0.Dock = System.Windows.Forms.DockStyle.Left; + this.radpbs0.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radpbs0.Location = new System.Drawing.Point(10, 19); + this.radpbs0.Name = "radpbs0"; + this.radpbs0.Size = new System.Drawing.Size(119, 66); + this.radpbs0.TabIndex = 8; + this.radpbs0.Text = "Off(0)"; + this.radpbs0.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radpbs0.UseVisualStyleBackColor = false; + // + // radspdh + // + this.radspdh.BackColor = System.Drawing.Color.WhiteSmoke; + this.radspdh.Bordercolor = System.Drawing.Color.DimGray; + this.radspdh.BorderRadius = 7; + this.radspdh.BorderSize = 2; + this.radspdh.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radspdh.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radspdh.CheckWidth = 30; + this.radspdh.Dock = System.Windows.Forms.DockStyle.Left; + this.radspdh.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radspdh.Location = new System.Drawing.Point(278, 19); + this.radspdh.Name = "radspdh"; + this.radspdh.Size = new System.Drawing.Size(119, 66); + this.radspdh.TabIndex = 2; + this.radspdh.Text = "고속"; + this.radspdh.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radspdh.UseVisualStyleBackColor = false; + // + // radspdm + // + this.radspdm.BackColor = System.Drawing.Color.WhiteSmoke; + this.radspdm.Bordercolor = System.Drawing.Color.DimGray; + this.radspdm.BorderRadius = 7; + this.radspdm.BorderSize = 2; + this.radspdm.Checked = true; + this.radspdm.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radspdm.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radspdm.CheckWidth = 30; + this.radspdm.Dock = System.Windows.Forms.DockStyle.Left; + this.radspdm.Font = new System.Drawing.Font("맑은 고딕", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radspdm.ForeColor = System.Drawing.Color.Blue; + this.radspdm.Location = new System.Drawing.Point(144, 19); + this.radspdm.Name = "radspdm"; + this.radspdm.Size = new System.Drawing.Size(119, 66); + this.radspdm.TabIndex = 1; + this.radspdm.TabStop = true; + this.radspdm.Text = "중속"; + this.radspdm.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radspdm.UseVisualStyleBackColor = false; + // + // radspdl + // + this.radspdl.BackColor = System.Drawing.Color.WhiteSmoke; + this.radspdl.Bordercolor = System.Drawing.Color.DimGray; + this.radspdl.BorderRadius = 7; + this.radspdl.BorderSize = 2; + this.radspdl.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radspdl.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radspdl.CheckWidth = 30; + this.radspdl.Dock = System.Windows.Forms.DockStyle.Left; + this.radspdl.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radspdl.Location = new System.Drawing.Point(10, 19); + this.radspdl.Name = "radspdl"; + this.radspdl.Size = new System.Drawing.Size(119, 66); + this.radspdl.TabIndex = 0; + this.radspdl.Text = "저속"; + this.radspdl.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radspdl.UseVisualStyleBackColor = false; + // + // radright + // + this.radright.BackColor = System.Drawing.Color.WhiteSmoke; + this.radright.Bordercolor = System.Drawing.Color.DimGray; + this.radright.BorderRadius = 7; + this.radright.BorderSize = 2; + this.radright.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radright.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radright.CheckWidth = 30; + this.radright.Dock = System.Windows.Forms.DockStyle.Left; + this.radright.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radright.Location = new System.Drawing.Point(278, 19); + this.radright.Name = "radright"; + this.radright.Size = new System.Drawing.Size(119, 66); + this.radright.TabIndex = 4; + this.radright.Text = "우측"; + this.radright.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radright.UseVisualStyleBackColor = false; + // + // radstrai + // + this.radstrai.BackColor = System.Drawing.Color.WhiteSmoke; + this.radstrai.Bordercolor = System.Drawing.Color.DimGray; + this.radstrai.BorderRadius = 7; + this.radstrai.BorderSize = 2; + this.radstrai.Checked = true; + this.radstrai.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radstrai.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radstrai.CheckWidth = 30; + this.radstrai.Dock = System.Windows.Forms.DockStyle.Left; + this.radstrai.Font = new System.Drawing.Font("맑은 고딕", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radstrai.ForeColor = System.Drawing.Color.Blue; + this.radstrai.Location = new System.Drawing.Point(144, 19); + this.radstrai.Name = "radstrai"; + this.radstrai.Size = new System.Drawing.Size(119, 66); + this.radstrai.TabIndex = 3; + this.radstrai.TabStop = true; + this.radstrai.Text = "직진"; + this.radstrai.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radstrai.UseVisualStyleBackColor = false; + // + // radleft + // + this.radleft.BackColor = System.Drawing.Color.WhiteSmoke; + this.radleft.Bordercolor = System.Drawing.Color.DimGray; + this.radleft.BorderRadius = 7; + this.radleft.BorderSize = 2; + this.radleft.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radleft.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radleft.CheckWidth = 30; + this.radleft.Dock = System.Windows.Forms.DockStyle.Left; + this.radleft.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radleft.Location = new System.Drawing.Point(10, 19); + this.radleft.Name = "radleft"; + this.radleft.Size = new System.Drawing.Size(119, 66); + this.radleft.TabIndex = 5; + this.radleft.Text = "좌측"; + this.radleft.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radleft.UseVisualStyleBackColor = false; + // // radbackward // this.radbackward.BackColor = System.Drawing.Color.WhiteSmoke; @@ -856,14 +831,6 @@ this.radbackward.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.radbackward.UseVisualStyleBackColor = false; // - // panel6 - // - this.panel6.Dock = System.Windows.Forms.DockStyle.Left; - this.panel6.Location = new System.Drawing.Point(129, 19); - this.panel6.Name = "panel6"; - this.panel6.Size = new System.Drawing.Size(15, 66); - this.panel6.TabIndex = 12; - // // radforward // this.radforward.BackColor = System.Drawing.Color.WhiteSmoke; @@ -886,20 +853,6 @@ this.radforward.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.radforward.UseVisualStyleBackColor = false; // - // label1 - // - this.label1.BackColor = System.Drawing.Color.Blue; - this.label1.Dock = System.Windows.Forms.DockStyle.Bottom; - this.label1.Font = new System.Drawing.Font("맑은 고딕", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.label1.ForeColor = System.Drawing.Color.White; - this.label1.Location = new System.Drawing.Point(607, 538); - this.label1.Name = "label1"; - this.label1.Padding = new System.Windows.Forms.Padding(0, 3, 0, 3); - this.label1.Size = new System.Drawing.Size(404, 38); - this.label1.TabIndex = 9; - this.label1.Text = "----------"; - this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // // guideSensor1 // this.guideSensor1.Dock = System.Windows.Forms.DockStyle.Top; @@ -912,11 +865,59 @@ this.guideSensor1.TabIndex = 8; this.guideSensor1.Text = "guideSensor1"; // + // btBack180 + // + this.btBack180.BackColor = System.Drawing.Color.WhiteSmoke; + this.btBack180.Cursor = System.Windows.Forms.Cursors.Hand; + this.btBack180.Dock = System.Windows.Forms.DockStyle.Fill; + this.btBack180.Font = new System.Drawing.Font("맑은 고딕", 10F, System.Drawing.FontStyle.Bold); + this.btBack180.ForeColor = System.Drawing.Color.Black; + this.btBack180.Location = new System.Drawing.Point(205, 3); + this.btBack180.Name = "btBack180"; + this.btBack180.Size = new System.Drawing.Size(196, 53); + this.btBack180.TabIndex = 15; + this.btBack180.Text = "백후 180도 회전 (Left)"; + this.btBack180.UseVisualStyleBackColor = false; + this.btBack180.Click += new System.EventHandler(this.btBack180_Click); + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.ColumnCount = 2; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.Controls.Add(this.btBack180, 1, 0); + this.tableLayoutPanel2.Controls.Add(this.btLeft180, 0, 0); + this.tableLayoutPanel2.Controls.Add(this.btRight180, 0, 1); + this.tableLayoutPanel2.Controls.Add(this.button2, 1, 1); + this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 438); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 2; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.Size = new System.Drawing.Size(404, 118); + this.tableLayoutPanel2.TabIndex = 12; + // + // button2 + // + this.button2.BackColor = System.Drawing.Color.WhiteSmoke; + this.button2.Cursor = System.Windows.Forms.Cursors.Hand; + this.button2.Dock = System.Windows.Forms.DockStyle.Fill; + this.button2.Font = new System.Drawing.Font("맑은 고딕", 10F, System.Drawing.FontStyle.Bold); + this.button2.ForeColor = System.Drawing.Color.Black; + this.button2.Location = new System.Drawing.Point(205, 62); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(196, 53); + this.button2.TabIndex = 15; + this.button2.Text = "백후 180도 회전(Right)"; + this.button2.UseVisualStyleBackColor = false; + this.button2.Click += new System.EventHandler(this.button2_Click); + // // fManual // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.Color.SlateGray; - this.ClientSize = new System.Drawing.Size(1014, 579); + this.ClientSize = new System.Drawing.Size(1014, 618); this.Controls.Add(this.panel2); this.Controls.Add(this.label1); this.Controls.Add(this.tableLayoutPanel1); @@ -929,11 +930,11 @@ this.VisibleChanged += new System.EventHandler(this.fManual_VisibleChanged); this.tableLayoutPanel1.ResumeLayout(false); this.panel2.ResumeLayout(false); - this.groupBox3.ResumeLayout(false); this.groupBox1.ResumeLayout(false); this.grpSpeed.ResumeLayout(false); this.grpBunki.ResumeLayout(false); this.groupBox2.ResumeLayout(false); + this.tableLayoutPanel2.ResumeLayout(false); this.ResumeLayout(false); } @@ -979,11 +980,10 @@ private System.Windows.Forms.Button button1; private arCtl.arLabel arLabel1; private System.Windows.Forms.Panel panel12; - private System.Windows.Forms.GroupBox groupBox3; - private System.Windows.Forms.Button btBack180; - private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Button btRight180; - private System.Windows.Forms.Panel panel10; private System.Windows.Forms.Button btLeft180; + private System.Windows.Forms.Button btBack180; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private System.Windows.Forms.Button button2; } } \ No newline at end of file diff --git a/Cs_HMI/Project/ViewForm/fManual.cs b/Cs_HMI/Project/ViewForm/fManual.cs index 8cac475..f1b55d0 100644 --- a/Cs_HMI/Project/ViewForm/fManual.cs +++ b/Cs_HMI/Project/ViewForm/fManual.cs @@ -331,7 +331,7 @@ namespace Project.ViewForm } - + private void arLabel1_Click_1(object sender, EventArgs e) { @@ -368,7 +368,12 @@ namespace Project.ViewForm private void btBack180_Click(object sender, EventArgs e) { //[STX] C T B 0 0 0 0 9 9 [ETX] - PUB.AGV.AGVMoveBack180Turn(); + PUB.AGV.AGVMoveBack180Turn(true); + } + + private void button2_Click(object sender, EventArgs e) + { + PUB.AGV.AGVMoveBack180Turn(false); } } } diff --git a/Cs_HMI/Project/fMain.Designer.cs b/Cs_HMI/Project/fMain.Designer.cs index 8253637..d14d87c 100644 --- a/Cs_HMI/Project/fMain.Designer.cs +++ b/Cs_HMI/Project/fMain.Designer.cs @@ -299,7 +299,7 @@ namespace Project this.btAutoRun.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; this.btAutoRun.GradientRepeatBG = false; this.btAutoRun.isButton = true; - this.btAutoRun.Location = new System.Drawing.Point(0, 288); + this.btAutoRun.Location = new System.Drawing.Point(0, 300); this.btAutoRun.Margin = new System.Windows.Forms.Padding(0); this.btAutoRun.MouseDownColor = System.Drawing.Color.Empty; this.btAutoRun.MouseOverColor = System.Drawing.Color.Empty; @@ -320,7 +320,7 @@ namespace Project this.btAutoRun.SignAlign = System.Drawing.ContentAlignment.BottomRight; this.btAutoRun.SignColor = System.Drawing.Color.Yellow; this.btAutoRun.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); - this.btAutoRun.Size = new System.Drawing.Size(259, 145); + this.btAutoRun.Size = new System.Drawing.Size(259, 152); this.btAutoRun.TabIndex = 22; this.btAutoRun.Text = "수동"; this.btAutoRun.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -367,7 +367,7 @@ namespace Project this.btChargeA.SignAlign = System.Drawing.ContentAlignment.BottomRight; this.btChargeA.SignColor = System.Drawing.Color.Yellow; this.btChargeA.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); - this.btChargeA.Size = new System.Drawing.Size(143, 144); + this.btChargeA.Size = new System.Drawing.Size(143, 150); this.btChargeA.TabIndex = 141; this.btChargeA.Text = "자동충전"; this.btChargeA.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -393,7 +393,7 @@ namespace Project this.lbTime.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; this.lbTime.GradientRepeatBG = false; this.lbTime.isButton = false; - this.lbTime.Location = new System.Drawing.Point(5, 574); + this.lbTime.Location = new System.Drawing.Point(5, 593); this.lbTime.Margin = new System.Windows.Forms.Padding(0); this.lbTime.MouseDownColor = System.Drawing.Color.Yellow; this.lbTime.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); @@ -982,7 +982,7 @@ namespace Project this.panRight.Location = new System.Drawing.Point(1015, 146); this.panRight.Name = "panRight"; this.panRight.Padding = new System.Windows.Forms.Padding(5, 0, 0, 0); - this.panRight.Size = new System.Drawing.Size(264, 599); + this.panRight.Size = new System.Drawing.Size(264, 618); this.panRight.TabIndex = 131; // // tableLayoutPanel1 @@ -1001,7 +1001,7 @@ namespace Project this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(259, 433); + this.tableLayoutPanel1.Size = new System.Drawing.Size(259, 452); this.tableLayoutPanel1.TabIndex = 0; // // btHome @@ -1043,7 +1043,7 @@ namespace Project this.btHome.SignAlign = System.Drawing.ContentAlignment.BottomRight; this.btHome.SignColor = System.Drawing.Color.Yellow; this.btHome.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); - this.btHome.Size = new System.Drawing.Size(116, 288); + this.btHome.Size = new System.Drawing.Size(116, 300); this.btHome.TabIndex = 141; this.btHome.Text = "홈"; this.btHome.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -1068,7 +1068,7 @@ namespace Project this.btChargeM.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; this.btChargeM.GradientRepeatBG = false; this.btChargeM.isButton = true; - this.btChargeM.Location = new System.Drawing.Point(116, 144); + this.btChargeM.Location = new System.Drawing.Point(116, 150); this.btChargeM.Margin = new System.Windows.Forms.Padding(0); this.btChargeM.MouseDownColor = System.Drawing.Color.Yellow; this.btChargeM.MouseOverColor = System.Drawing.Color.Lime; @@ -1089,7 +1089,7 @@ namespace Project this.btChargeM.SignAlign = System.Drawing.ContentAlignment.BottomRight; this.btChargeM.SignColor = System.Drawing.Color.Yellow; this.btChargeM.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); - this.btChargeM.Size = new System.Drawing.Size(143, 144); + this.btChargeM.Size = new System.Drawing.Size(143, 150); this.btChargeM.TabIndex = 141; this.btChargeM.Text = "수동충전"; this.btChargeM.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -1498,7 +1498,7 @@ namespace Project // this.panel5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); this.panel5.Dock = System.Windows.Forms.DockStyle.Bottom; - this.panel5.Location = new System.Drawing.Point(5, 569); + this.panel5.Location = new System.Drawing.Point(5, 588); this.panel5.Name = "panel5"; this.panel5.Size = new System.Drawing.Size(259, 5); this.panel5.TabIndex = 142; @@ -1752,7 +1752,7 @@ namespace Project // this.pandBottomDIO.Controls.Add(this.panel9); this.pandBottomDIO.Dock = System.Windows.Forms.DockStyle.Bottom; - this.pandBottomDIO.Location = new System.Drawing.Point(1, 745); + this.pandBottomDIO.Location = new System.Drawing.Point(1, 764); this.pandBottomDIO.Margin = new System.Windows.Forms.Padding(0); this.pandBottomDIO.Name = "pandBottomDIO"; this.pandBottomDIO.Size = new System.Drawing.Size(1278, 35); @@ -1928,7 +1928,7 @@ namespace Project this.panDlg.Location = new System.Drawing.Point(1, 146); this.panDlg.Margin = new System.Windows.Forms.Padding(0); this.panDlg.Name = "panDlg"; - this.panDlg.Size = new System.Drawing.Size(1014, 599); + this.panDlg.Size = new System.Drawing.Size(1014, 618); this.panDlg.TabIndex = 146; // // arPanel2 @@ -2200,7 +2200,7 @@ namespace Project // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(15)))), ((int)(((byte)(15)))), ((int)(((byte)(15))))); - this.ClientSize = new System.Drawing.Size(1280, 781); + this.ClientSize = new System.Drawing.Size(1280, 800); this.Controls.Add(this.panDlg); this.Controls.Add(this.panRight); this.Controls.Add(this.arPanel2); diff --git a/Cs_HMI/Project/fSetup.Designer.cs b/Cs_HMI/Project/fSetup.Designer.cs index d148467..47f262e 100644 --- a/Cs_HMI/Project/fSetup.Designer.cs +++ b/Cs_HMI/Project/fSetup.Designer.cs @@ -39,6 +39,8 @@ this.btAutoCharge = new arCtl.arLabel(); this.btSpeaker = new arCtl.arLabel(); this.tabPage1 = new System.Windows.Forms.TabPage(); + this.label7 = new System.Windows.Forms.Label(); + this.vcXBID = new AGVControl.ValueSelect(); this.tbagvchannel = new System.Windows.Forms.TextBox(); this.tbagvpanid = new System.Windows.Forms.TextBox(); this.tbagvaddr = new System.Windows.Forms.TextBox(); @@ -202,8 +204,8 @@ this.bt1 = new arCtl.arLabel(); this.bt0 = new arCtl.arLabel(); this.btSave = new arCtl.arLabel(); - this.label7 = new System.Windows.Forms.Label(); - this.vcXBID = new AGVControl.ValueSelect(); + this.label13 = new System.Windows.Forms.Label(); + this.vcGDS = new AGVControl.ValueSelect(); this.tabControl1.SuspendLayout(); this.tabPage6.SuspendLayout(); this.panel1.SuspendLayout(); @@ -430,6 +432,8 @@ // tabPage1 // this.tabPage1.BackColor = System.Drawing.Color.Navy; + this.tabPage1.Controls.Add(this.label13); + this.tabPage1.Controls.Add(this.vcGDS); this.tabPage1.Controls.Add(this.label7); this.tabPage1.Controls.Add(this.vcXBID); this.tabPage1.Controls.Add(this.tbagvchannel); @@ -481,6 +485,41 @@ this.tabPage1.TabIndex = 0; this.tabPage1.Text = "AGV"; // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label7.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label7.Location = new System.Drawing.Point(162, 524); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(101, 24); + this.label7.TabIndex = 79; + this.label7.Text = "Xbee ID"; + this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // vcXBID + // + this.vcXBID.BackColorButton = System.Drawing.Color.White; + this.vcXBID.ButtonWidth = "30"; + this.vcXBID.ColorBorder = System.Drawing.Color.White; + this.vcXBID.DecimalPosition = ((ushort)(0)); + this.vcXBID.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcXBID.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcXBID.ForeColor = System.Drawing.Color.White; + this.vcXBID.ForeColorButton = System.Drawing.Color.Black; + this.vcXBID.Location = new System.Drawing.Point(269, 509); + this.vcXBID.MaxValue = 9999D; + this.vcXBID.MinValue = 0D; + this.vcXBID.Name = "vcXBID"; + this.vcXBID.NullDisplay = "--"; + this.vcXBID.SideButtonClickValue = 1D; + this.vcXBID.Size = new System.Drawing.Size(164, 54); + this.vcXBID.TabIndex = 78; + this.vcXBID.Tag = "SDH"; + this.vcXBID.Text = "30"; + this.vcXBID.Value = 30D; + this.vcXBID.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // // tbagvchannel // this.tbagvchannel.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold); @@ -3333,40 +3372,39 @@ this.btSave.TextVisible = true; this.btSave.Click += new System.EventHandler(this.btSave_Click); // - // label7 + // label13 // - this.label7.AutoSize = true; - this.label7.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.label7.ForeColor = System.Drawing.Color.WhiteSmoke; - this.label7.Location = new System.Drawing.Point(162, 524); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(101, 24); - this.label7.TabIndex = 79; - this.label7.Text = "Xbee ID"; - this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.label13.AutoSize = true; + this.label13.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label13.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label13.Location = new System.Drawing.Point(526, 524); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(101, 24); + this.label13.TabIndex = 81; + this.label13.Text = "TurnGDS"; + this.label13.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // - // vcXBID + // vcTurnGDS // - this.vcXBID.BackColorButton = System.Drawing.Color.White; - this.vcXBID.ButtonWidth = "30"; - this.vcXBID.ColorBorder = System.Drawing.Color.White; - this.vcXBID.DecimalPosition = ((ushort)(0)); - this.vcXBID.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); - this.vcXBID.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.vcXBID.ForeColor = System.Drawing.Color.White; - this.vcXBID.ForeColorButton = System.Drawing.Color.Black; - this.vcXBID.Location = new System.Drawing.Point(269, 509); - this.vcXBID.MaxValue = 9999D; - this.vcXBID.MinValue = 0D; - this.vcXBID.Name = "vcXBID"; - this.vcXBID.NullDisplay = "--"; - this.vcXBID.SideButtonClickValue = 1D; - this.vcXBID.Size = new System.Drawing.Size(164, 54); - this.vcXBID.TabIndex = 78; - this.vcXBID.Tag = "SDH"; - this.vcXBID.Text = "30"; - this.vcXBID.Value = 30D; - this.vcXBID.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcGDS.BackColorButton = System.Drawing.Color.White; + this.vcGDS.ButtonWidth = "30"; + this.vcGDS.ColorBorder = System.Drawing.Color.White; + this.vcGDS.DecimalPosition = ((ushort)(0)); + this.vcGDS.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcGDS.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcGDS.ForeColor = System.Drawing.Color.White; + this.vcGDS.ForeColorButton = System.Drawing.Color.Black; + this.vcGDS.Location = new System.Drawing.Point(633, 509); + this.vcGDS.MaxValue = 9999D; + this.vcGDS.MinValue = 0D; + this.vcGDS.Name = "vcTurnGDS"; + this.vcGDS.NullDisplay = "--"; + this.vcGDS.SideButtonClickValue = 1D; + this.vcGDS.Size = new System.Drawing.Size(164, 54); + this.vcGDS.TabIndex = 80; + this.vcGDS.Tag = "SDH"; + this.vcGDS.Text = "1000"; + this.vcGDS.Value = 1000D; // // fSetup // @@ -3588,5 +3626,7 @@ private System.Windows.Forms.CheckBox chkClearPos; private System.Windows.Forms.Label label7; private AGVControl.ValueSelect vcXBID; + private System.Windows.Forms.Label label13; + private AGVControl.ValueSelect vcGDS; } } \ No newline at end of file diff --git a/Cs_HMI/Project/fSetup.cs b/Cs_HMI/Project/fSetup.cs index ac1b00b..29bc233 100644 --- a/Cs_HMI/Project/fSetup.cs +++ b/Cs_HMI/Project/fSetup.cs @@ -77,6 +77,7 @@ namespace Project vcSTT.Value = PUB.setting.STT; vcSAD.Value = PUB.setting.SAD; vcXBID.Value = PUB.setting.XBE_ID; + vcGDS.Value = PUB.setting.GDSValue; tbagvaddr.Text = PUB.setting.AGV_ADDRESS; tbagvpanid.Text = PUB.setting.AGV_PANID; @@ -262,6 +263,7 @@ namespace Project PUB.setting.STT = (int)vcSTT.Value; PUB.setting.SAD = (int)vcSAD.Value; PUB.setting.XBE_ID = (byte)vcXBID.Value; + PUB.setting.GDSValue = (UInt16)vcGDS.Value; //속도 저/중/고 PUB.setting.SPD_L = (int)vcSpeedL.Value; diff --git a/Cs_HMI/SubProject/AGV/Command.cs b/Cs_HMI/SubProject/AGV/Command.cs index eab8dee..2307e44 100644 --- a/Cs_HMI/SubProject/AGV/Command.cs +++ b/Cs_HMI/SubProject/AGV/Command.cs @@ -65,7 +65,7 @@ namespace arDev { return AddCommand(cmd + data); } - + public bool LiftControl(LiftCommand cmd) { return AddCommand(eAgvCmd.LiftControl, cmd.ToString()); @@ -86,9 +86,10 @@ namespace arDev return AddCommand(eAgvCmd.GateoutTime, time.ToString("0000")); } - public bool TurnGDSCenterScope() + public bool TurnGDSCenterScope(UInt16 time) { - return AddCommand(eAgvCmd.TurnGDSCenterScope); + if (time > 2000) time = 2000; + return AddCommand(eAgvCmd.TurnGDSCenterScope, time.ToString("0000")); } public bool AGVMoveLeft180Turn() { @@ -98,9 +99,10 @@ namespace arDev { return AddCommand(eAgvCmd.TurnRight); } - public bool AGVMoveBack180Turn() + public bool AGVMoveBack180Turn(bool leftTurn) { - return AddCommand(eAgvCmd.TurnBack); + var dir = leftTurn ? "L" : "R"; + return AddCommand(eAgvCmd.BackAndTurn, dir); } @@ -165,7 +167,7 @@ namespace arDev return AddCommand(cmds); } - + protected bool AddCommand(params string[] cmds) { bool ret = true; @@ -240,8 +242,9 @@ namespace arDev cmdString = $"CTR0000"; retval = AddCommand(cmdString); break; - case eAgvCmd.TurnBack: - cmdString = $"CTB0000"; + case eAgvCmd.BackAndTurn: + if (param.isEmpty()) param = "L"; + cmdString = $"CTB000{param}"; retval = AddCommand(cmdString); break; case eAgvCmd.CallCancle: @@ -270,7 +273,8 @@ namespace arDev retval = AddCommand(cmdString); break; case eAgvCmd.TurnGDSCenterScope: - cmdString = "SGS1000"; + if (param.isEmpty()) param = "1000"; + cmdString = "SGS{param}"; retval = AddCommand(cmdString); break; case eAgvCmd.BackTrunResumeTime: diff --git a/Cs_HMI/SubProject/AGV/EnumData.cs b/Cs_HMI/SubProject/AGV/EnumData.cs index 0c4a93f..1e57b04 100644 --- a/Cs_HMI/SubProject/AGV/EnumData.cs +++ b/Cs_HMI/SubProject/AGV/EnumData.cs @@ -151,7 +151,7 @@ namespace arDev /// /// CMD : CTB0000 /// - TurnBack, + BackAndTurn, /// /// CMD : CBZ