"refactor:Improve-map-loading-and-use-canvas-nodes"
This commit is contained in:
@@ -31,7 +31,7 @@ namespace Project
|
||||
public static bool AutRebootAlreay = false;
|
||||
public static bool DriveSpeed = false;
|
||||
public static AGVNavigationCore.Controls.UnifiedAGVCanvas _mapCanvas;
|
||||
public static List<MapNode> _mapNodes;
|
||||
//public static List<MapNode> _mapNodes;
|
||||
|
||||
/// <summary>
|
||||
/// 다음 작업 명령 (PickOn/PickOff)
|
||||
@@ -612,18 +612,21 @@ namespace Project
|
||||
#region VirtualAGV 실제 데이터 동기화
|
||||
public static MapNode FindByNodeID(string nodeidx)
|
||||
{
|
||||
var _mapNodes = PUB._mapCanvas.Nodes;
|
||||
if (_mapNodes == null || _mapNodes.Any() == false) return null;
|
||||
if (nodeidx.isEmpty()) return null;
|
||||
return _mapNodes.Where(t => t.Id.Equals(nodeidx)).FirstOrDefault();
|
||||
}
|
||||
public static MapNode FindByRFID(string rfidValue)
|
||||
{
|
||||
var _mapNodes = PUB._mapCanvas.Nodes;
|
||||
if (_mapNodes == null || _mapNodes.Any() == false) return null;
|
||||
if (rfidValue.isEmpty()) return null;
|
||||
return _mapNodes.Where(t => t.RfidId.Equals(rfidValue)).FirstOrDefault();
|
||||
}
|
||||
public static List<MapNode> FindByNodeAlias(string alias)
|
||||
{
|
||||
var _mapNodes = PUB._mapCanvas.Nodes;
|
||||
if (_mapNodes == null || _mapNodes.Any() == false) return null;
|
||||
if (alias.isEmpty()) return null;
|
||||
var lst = _mapNodes.Where(t => t.AliasName.Equals(alias));
|
||||
@@ -632,6 +635,7 @@ namespace Project
|
||||
}
|
||||
public static List<MapNode> FindByNodeType(AGVNavigationCore.Models.MapNode type)
|
||||
{
|
||||
var _mapNodes = PUB._mapCanvas.Nodes;
|
||||
if (_mapNodes == null || _mapNodes.Any() == false) return null;
|
||||
var lst = _mapNodes.Where(t => t.Type.Equals(type));
|
||||
if (lst.Any() == false) return null;
|
||||
@@ -645,6 +649,7 @@ namespace Project
|
||||
/// <returns>업데이트 성공 여부</returns>
|
||||
public static bool UpdateAGVFromRFID(string rfidId, AgvDirection motorDirection = AgvDirection.Forward)
|
||||
{
|
||||
var _mapNodes = PUB._mapCanvas.Nodes;
|
||||
if (_virtualAGV == null || _mapNodes == null) return false;
|
||||
|
||||
// RFID에 해당하는 노드 찾기
|
||||
@@ -670,6 +675,7 @@ namespace Project
|
||||
/// <returns>업데이트 성공 여부</returns>
|
||||
public static bool UpdateAGVToNode(string nodeId, AgvDirection motorDirection = AgvDirection.Forward)
|
||||
{
|
||||
var _mapNodes = PUB._mapCanvas.Nodes;
|
||||
if (_virtualAGV == null || _mapNodes == null) return false;
|
||||
|
||||
var node = _mapNodes.FirstOrDefault(n => n.Id == nodeId);
|
||||
|
||||
@@ -292,7 +292,7 @@ namespace Project
|
||||
// 만약 수행되지 않았다면 여기서 수행.
|
||||
if (pathResult.DockingValidation == null)
|
||||
{
|
||||
pathResult.DockingValidation = AGVNavigationCore.Utils.DockingValidator.ValidateDockingDirection(pathResult, PUB._mapNodes);
|
||||
pathResult.DockingValidation = AGVNavigationCore.Utils.DockingValidator.ValidateDockingDirection(pathResult, PUB._mapCanvas.Nodes);
|
||||
}
|
||||
|
||||
// 검증 결과 확인
|
||||
|
||||
@@ -60,11 +60,15 @@ namespace Project
|
||||
|
||||
//if (chg_run && PUB.AGV.system1.agv_run) PUB.Speak("이동을 시작 합니다");
|
||||
VAR.BOOL[eVarBool.AGVDIR_BACK] = PUB.AGV.data.Direction == 'B';
|
||||
var syncDir = PUB.AGV.data.Direction == 'B' ? AgvDirection.Backward : AgvDirection.Forward;
|
||||
|
||||
// [Sync] Update VirtualAGV Direction
|
||||
var syncDir = PUB.AGV.data.Direction == 'B' ? AgvDirection.Backward : AgvDirection.Forward;
|
||||
if (PUB._virtualAGV.CurrentDirection != syncDir)
|
||||
PUB.UpdateAGVDirection(syncDir);
|
||||
if (PUB._virtualAGV != null)
|
||||
{
|
||||
if (PUB._virtualAGV.CurrentDirection != syncDir)
|
||||
PUB.UpdateAGVDirection(syncDir);
|
||||
}
|
||||
|
||||
|
||||
// [Sync] Update VirtualAGV State
|
||||
AGVState syncState = AGVState.Idle;
|
||||
@@ -72,7 +76,7 @@ namespace Project
|
||||
else if (PUB.AGV.system1.Battery_charging) syncState = AGVState.Charging;
|
||||
else if (PUB.AGV.system1.agv_run) syncState = AGVState.Moving;
|
||||
|
||||
if (PUB._virtualAGV.GetCurrentState() != syncState)
|
||||
if (PUB._virtualAGV != null && PUB._virtualAGV.GetCurrentState() != syncState)
|
||||
PUB.UpdateAGVState(syncState);
|
||||
|
||||
if (VAR.BOOL[eVarBool.AGV_ERROR] != (agv_err > 0))
|
||||
@@ -156,9 +160,9 @@ namespace Project
|
||||
case arDev.Narumi.DataType.TAG:
|
||||
{
|
||||
//자동 실행 중이다.
|
||||
PUB.log.Add($"AGV 태그수신 : {PUB.AGV.data.TagNo}");
|
||||
PUB.Result.LastTAG = PUB.AGV.data.TagNo.ToString();
|
||||
|
||||
|
||||
PUB.Result.LastTAG = PUB.AGV.data.TagNo.ToString("0000");
|
||||
PUB.log.Add($"AGV 태그수신 : {PUB.AGV.data.TagNo} LastTag:{PUB.Result.LastTAG}");
|
||||
//POT/NOT 보면 일단 바로 멈추게한다
|
||||
if (PUB.Result.CurrentPos == ePosition.POT || PUB.Result.CurrentPos == ePosition.NOT)
|
||||
{
|
||||
@@ -168,7 +172,7 @@ namespace Project
|
||||
}
|
||||
|
||||
//virtual agv setting
|
||||
var CurrentNode = PUB._mapNodes.FirstOrDefault(t => t.RfidId.Equals(PUB.Result.LastTAG, StringComparison.OrdinalIgnoreCase));
|
||||
var CurrentNode = PUB._mapCanvas.Nodes.FirstOrDefault(t => t.RfidId.Equals(PUB.Result.LastTAG, StringComparison.OrdinalIgnoreCase));
|
||||
if (CurrentNode == null)
|
||||
{
|
||||
//없는 노드는 자동으로 추가한다
|
||||
@@ -184,10 +188,10 @@ namespace Project
|
||||
};
|
||||
|
||||
// 맵 노드 리스트에 추가
|
||||
PUB._mapNodes.Add(newNode);
|
||||
PUB._mapCanvas.Nodes.Add(newNode);
|
||||
|
||||
// 캔버스에 노드 반영 (재설정)
|
||||
PUB._mapCanvas.Nodes = PUB._mapNodes;
|
||||
PUB._mapCanvas.Nodes = PUB._mapCanvas.Nodes;
|
||||
|
||||
// 로그 기록
|
||||
PUB.log.AddI($"RFID:{PUB.Result.LastTAG} 노드를 자동 추가했습니다 (NodeId: {newNodeId})");
|
||||
@@ -217,7 +221,7 @@ namespace Project
|
||||
}
|
||||
|
||||
//이 후 상황을 예측한다
|
||||
if (PUB._mapCanvas != null)
|
||||
if (PUB._mapCanvas != null && PUB._virtualAGV != null)
|
||||
{
|
||||
var nextAction = PUB._virtualAGV.Predict();
|
||||
var message = $"[다음 행동 예측]\n\n" +
|
||||
|
||||
@@ -48,7 +48,7 @@ namespace Project
|
||||
if (data.Length > 4)
|
||||
{
|
||||
var currTag = System.Text.Encoding.Default.GetString(data, 1, data.Length - 1);
|
||||
var node = PUB._mapNodes.FirstOrDefault(t => t.RfidId == currTag);
|
||||
var node = PUB._mapCanvas.Nodes.FirstOrDefault(t => t.RfidId == currTag);
|
||||
if (node == null)
|
||||
{
|
||||
PUB.log.AddE($"[{logPrefix}-SetCurrent] 노드정보를 찾을 수 없습니다 RFID:{currTag}");
|
||||
@@ -111,7 +111,7 @@ namespace Project
|
||||
if (data.Length > 4)
|
||||
{
|
||||
var currTag = System.Text.Encoding.Default.GetString(data, 1, data.Length - 1);
|
||||
var targetNode = PUB._mapNodes.FirstOrDefault(t => t.RfidId == currTag);
|
||||
var targetNode = PUB._mapCanvas.Nodes.FirstOrDefault(t => t.RfidId == currTag);
|
||||
|
||||
|
||||
//자동상태가아니라면 처리하지 않는다.
|
||||
@@ -131,7 +131,7 @@ namespace Project
|
||||
}
|
||||
|
||||
///출발지
|
||||
var startNode = PUB._mapNodes.FirstOrDefault(t => t.RfidId == PUB._virtualAGV.CurrentNode.Id);
|
||||
var startNode = PUB._mapCanvas.Nodes.FirstOrDefault(t => t.RfidId == PUB._virtualAGV.CurrentNode.Id);
|
||||
PUB._virtualAGV.StartNode = startNode;
|
||||
if (startNode == null)
|
||||
{
|
||||
@@ -150,7 +150,7 @@ namespace Project
|
||||
{
|
||||
//경로예측을 화면에 표시해준다.
|
||||
PUB._virtualAGV.SetPath(rltGoto.result);
|
||||
var pathWithRfid = rltGoto.result.GetSimplePath().Select(nodeId => PUB._virtualAGV.GetRfidByNodeId(PUB._mapNodes, nodeId)).ToList();
|
||||
var pathWithRfid = rltGoto.result.GetSimplePath().Select(nodeId => PUB._virtualAGV.GetRfidByNodeId(PUB._mapCanvas.Nodes, nodeId)).ToList();
|
||||
PUB.log.Add($"경로예측결과:{pathWithRfid}");
|
||||
}
|
||||
}
|
||||
@@ -260,7 +260,7 @@ namespace Project
|
||||
AGVNavigationCore.PathFinding.Planning.AGVPathfinder _advancedPathfinder = null;
|
||||
(AGVNavigationCore.PathFinding.Core.AGVPathResult result, string message) CalcPath(MapNode startNode, MapNode targetNode)
|
||||
{
|
||||
var _mapNodes = PUB._mapNodes;
|
||||
var _mapNodes = PUB._mapCanvas.Nodes;
|
||||
// 시작 RFID가 없으면 AGV 현재 위치로 설정
|
||||
if (startNode == null || targetNode == null)
|
||||
return (null, "시작 RFID와 목표 RFID를 선택해주세요.");
|
||||
|
||||
@@ -40,11 +40,7 @@ namespace Project.ViewForm
|
||||
|
||||
private void InitializeMapCanvas()
|
||||
{
|
||||
PUB._mapCanvas = new AGVNavigationCore.Controls.UnifiedAGVCanvas();
|
||||
PUB._mapCanvas.Dock = DockStyle.Fill;
|
||||
PUB._mapCanvas.ShowGrid = false;
|
||||
PUB._mapCanvas.BackColor = Color.FromArgb(32, 32, 32);
|
||||
PUB._mapCanvas.ForeColor = Color.White;
|
||||
|
||||
// RfidMappings 제거 - MapNode에 통합됨
|
||||
|
||||
// 이벤트 연결
|
||||
@@ -116,7 +112,7 @@ namespace Project.ViewForm
|
||||
}
|
||||
|
||||
// 1. 경로 생성
|
||||
var pathFinder = new AGVNavigationCore.PathFinding.Planning.AGVPathfinder(PUB._mapNodes);
|
||||
var pathFinder = new AGVNavigationCore.PathFinding.Planning.AGVPathfinder(PUB._mapCanvas.Nodes);
|
||||
|
||||
// 현재위치에서 목표위치까지
|
||||
var result = pathFinder.FindPath(PUB._virtualAGV.CurrentNode, targetNode);
|
||||
@@ -178,12 +174,12 @@ namespace Project.ViewForm
|
||||
|
||||
if (result.Success)
|
||||
{
|
||||
if (PUB._mapNodes == null) PUB._mapNodes = new List<MapNode>();
|
||||
else PUB._mapNodes.Clear();
|
||||
PUB._mapNodes.AddRange(result.Nodes);
|
||||
if (PUB._mapCanvas.Nodes == null) PUB._mapCanvas.Nodes = new List<MapNode>();
|
||||
else PUB._mapCanvas.Nodes.Clear();
|
||||
PUB._mapCanvas.Nodes.AddRange(result.Nodes);
|
||||
|
||||
// 맵 캔버스에 데이터 설정
|
||||
PUB._mapCanvas.Nodes = PUB._mapNodes;
|
||||
PUB._mapCanvas.Nodes = PUB._mapCanvas.Nodes;
|
||||
PUB._mapCanvas.MapFileName = filePath.FullName;
|
||||
|
||||
// 🔥 맵 설정 적용 (배경색, 그리드 표시)
|
||||
@@ -194,9 +190,9 @@ namespace Project.ViewForm
|
||||
}
|
||||
|
||||
// 🔥 가상 AGV 초기화 (첫 노드 위치에 생성)
|
||||
if (PUB._virtualAGV == null && PUB._mapNodes.Count > 0)
|
||||
if (PUB._virtualAGV == null && PUB._mapCanvas.Nodes.Count > 0)
|
||||
{
|
||||
var startNode = PUB._mapNodes.FirstOrDefault(n => n.IsNavigationNode());
|
||||
var startNode = PUB._mapCanvas.Nodes.FirstOrDefault(n => n.IsNavigationNode());
|
||||
if (startNode != null)
|
||||
{
|
||||
PUB._virtualAGV = new VirtualAGV(PUB.setting.MCID, startNode.Position, AgvDirection.Forward);
|
||||
|
||||
@@ -61,6 +61,15 @@ namespace Project
|
||||
usbdet.DeviceArrived += Usbdet_DeviceArrived;
|
||||
usbdet.DeviceRemoved += Usbdet_DeviceRemoved;
|
||||
|
||||
|
||||
PUB._mapCanvas = new AGVNavigationCore.Controls.UnifiedAGVCanvas();
|
||||
PUB._mapCanvas.Dock = DockStyle.Fill;
|
||||
PUB._mapCanvas.ShowGrid = false;
|
||||
PUB._mapCanvas.BackColor = Color.FromArgb(32, 32, 32);
|
||||
PUB._mapCanvas.ForeColor = Color.White;
|
||||
|
||||
|
||||
|
||||
this.panTopMenu.MouseMove += LbTitle_MouseMove;
|
||||
this.panTopMenu.MouseUp += LbTitle_MouseUp;
|
||||
this.panTopMenu.MouseDown += LbTitle_MouseDown;
|
||||
@@ -776,7 +785,7 @@ namespace Project
|
||||
|
||||
var od = new OpenFileDialog
|
||||
{
|
||||
Filter = "AGV Map Files (*.agvmap)|*.agvmap|All Files (*.*)|*.*",
|
||||
Filter = "AGV Map Files (*.agvmap;*.json)|*.agvmap;*.json|All Files (*.*)|*.*",
|
||||
DefaultExt = "agvmap",
|
||||
FileName = PUB._mapCanvas.MapFileName,
|
||||
};
|
||||
@@ -801,24 +810,9 @@ namespace Project
|
||||
if (result.Success)
|
||||
{
|
||||
var _mapCanvas = PUB._mapCanvas;
|
||||
PUB._mapNodes = result.Nodes;
|
||||
_mapCanvas.SetMapLoadResult(result);
|
||||
PUB.log.Add($"Set _mapNodes");
|
||||
|
||||
// 맵 캔버스에 데이터 설정
|
||||
_mapCanvas.Nodes = result.Nodes;
|
||||
_mapCanvas.Labels = result.Labels;
|
||||
_mapCanvas.Images = result.Images;
|
||||
_mapCanvas.Marks = result.Marks;
|
||||
_mapCanvas.Magnets = result.Magnets;
|
||||
// RfidMappings 제거됨 - MapNode에 통합
|
||||
|
||||
// 🔥 맵 설정 적용 (배경색, 그리드 표시)
|
||||
if (result.Settings != null)
|
||||
{
|
||||
_mapCanvas.BackColor = System.Drawing.Color.FromArgb(result.Settings.BackgroundColorArgb);
|
||||
_mapCanvas.ShowGrid = result.Settings.ShowGrid;
|
||||
}
|
||||
|
||||
// 설정에 마지막 맵 파일 경로 저장
|
||||
PUB.setting.LastMapFile = filePath;
|
||||
PUB.setting.Save();
|
||||
@@ -860,7 +854,7 @@ namespace Project
|
||||
}
|
||||
|
||||
var _mapCanvas = PUB._mapCanvas;
|
||||
var _mapNodes = PUB._mapNodes;
|
||||
|
||||
|
||||
// 🔥 현재 캔버스 설정을 맵 파일에 저장
|
||||
var settings = new MapLoader.MapSettings
|
||||
@@ -869,7 +863,11 @@ namespace Project
|
||||
ShowGrid = _mapCanvas.ShowGrid
|
||||
};
|
||||
|
||||
if (MapLoader.SaveMapToFile(filePath, _mapNodes, _mapCanvas.Labels, _mapCanvas.Images, _mapCanvas.Marks, _mapCanvas.Magnets, settings))
|
||||
if (MapLoader.SaveMapToFile(filePath,
|
||||
_mapCanvas.Nodes, _mapCanvas.Labels,
|
||||
_mapCanvas.Images, _mapCanvas.Marks,
|
||||
_mapCanvas.Magnets,
|
||||
settings))
|
||||
{
|
||||
// 설정에 마지막 맵 파일 경로 저장
|
||||
PUB.setting.LastMapFile = filePath;
|
||||
|
||||
Reference in New Issue
Block a user