..
This commit is contained in:
@@ -104,6 +104,10 @@ namespace AGVNavigationCore.Controls
|
||||
HandleConnectClick(hitNode as MapNode);
|
||||
break;
|
||||
|
||||
case EditMode.ConnectDirection:
|
||||
HandleConnectDirectionClick(hitNode as MapNode);
|
||||
break;
|
||||
|
||||
case EditMode.Delete:
|
||||
HandleDeleteClick(hitNode);
|
||||
break;
|
||||
@@ -227,6 +231,23 @@ namespace AGVNavigationCore.Controls
|
||||
if (handleIdx != -1)
|
||||
{
|
||||
_dragHandleIndex = handleIdx;
|
||||
|
||||
// 핸들 드래그 시 초기 오프셋 설정 (점프 현상 방지)
|
||||
if (_selectedNode is MapMagnet magnet)
|
||||
{
|
||||
Point handlePos = Point.Empty;
|
||||
if (handleIdx == 0) handlePos = magnet.StartPoint;
|
||||
else if (handleIdx == 1) handlePos = magnet.EndPoint;
|
||||
else if (handleIdx == 2 && magnet.ControlPoint != null)
|
||||
handlePos = new Point((int)magnet.ControlPoint.X, (int)magnet.ControlPoint.Y);
|
||||
|
||||
_dragOffset = new Point(worldPoint.X - handlePos.X, worldPoint.Y - handlePos.Y);
|
||||
}
|
||||
else
|
||||
{
|
||||
_dragOffset = Point.Empty; // Mark 등은 오프셋 없이 마우스 포인터 기준 계산
|
||||
}
|
||||
|
||||
_isDragging = true;
|
||||
_isPanning = false;
|
||||
Capture = true;
|
||||
@@ -562,12 +583,11 @@ namespace AGVNavigationCore.Controls
|
||||
switch (node.StationType)
|
||||
{
|
||||
case StationType.Loader:
|
||||
case StationType.UnLoader:
|
||||
case StationType.Clearner:
|
||||
case StationType.Cleaner:
|
||||
case StationType.Plating:
|
||||
case StationType.Buffer:
|
||||
return IsPointInPentagon(point, node);
|
||||
case StationType.Charger2:
|
||||
case StationType.Charger1:
|
||||
case StationType.Charger:
|
||||
return IsPointInTriangle(point, node);
|
||||
default:
|
||||
return IsPointInCircle(point, node);
|
||||
@@ -887,7 +907,9 @@ namespace AGVNavigationCore.Controls
|
||||
var newNode = new MapNode
|
||||
{
|
||||
Id = newNodeId,
|
||||
Position = worldPoint
|
||||
Position = worldPoint,
|
||||
CanTurnLeft=false,
|
||||
CanTurnRight= false,
|
||||
};
|
||||
|
||||
_nodes.Add(newNode);
|
||||
@@ -998,6 +1020,31 @@ namespace AGVNavigationCore.Controls
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
private void HandleConnectDirectionClick(MapNode hitNode)
|
||||
{
|
||||
if (hitNode == null) return;
|
||||
|
||||
if (!_isConnectionMode)
|
||||
{
|
||||
// 연결 시작 (방향 설정)
|
||||
_isConnectionMode = true;
|
||||
_connectionStartNode = hitNode;
|
||||
_selectedNode = hitNode;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 연결 완료
|
||||
if (_connectionStartNode != null && _connectionStartNode != hitNode)
|
||||
{
|
||||
// 기본값 S (Straight)로 방향 설정
|
||||
SetMagnetDirection(_connectionStartNode, hitNode, MagnetPosition.S);
|
||||
}
|
||||
CancelConnection();
|
||||
}
|
||||
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
private void HandleDeleteClick(MapNode hitNode)
|
||||
{
|
||||
if (hitNode == null) return;
|
||||
@@ -1025,10 +1072,46 @@ namespace AGVNavigationCore.Controls
|
||||
toNode.ConnectedNodes.Contains(fromNode.Id))
|
||||
return;
|
||||
|
||||
// 양방향 연결 생성 (AGV가 양쪽 방향으로 이동 가능하도록)
|
||||
// 양방향 연결 생성 (AGV가 양쪽 방향으로 이동 가능하도록)
|
||||
fromNode.AddConnection(toNode.Id);
|
||||
toNode.AddConnection(fromNode.Id);
|
||||
|
||||
// 🔥 화면 표시용 ConnectedMapNodes 리스트도 즉시 갱신해야 함
|
||||
if (!fromNode.ConnectedMapNodes.Contains(toNode))
|
||||
fromNode.ConnectedMapNodes.Add(toNode);
|
||||
|
||||
if (!toNode.ConnectedMapNodes.Contains(fromNode))
|
||||
toNode.ConnectedMapNodes.Add(fromNode);
|
||||
|
||||
ConnectionCreated?.Invoke(this, (fromNode, toNode));
|
||||
MapChanged?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
public void SetMagnetDirection(MapNode fromNode, MapNode toNode, MagnetPosition direction)
|
||||
{
|
||||
if (fromNode == null || toNode == null) return;
|
||||
|
||||
// 이미 연결된 노드인지 확인 (연결되어 있어야 방향 설정 가능)
|
||||
// 이미 연결된 노드인지 확인 (연결되어 있어야 방향 설정 가능)
|
||||
if (!fromNode.ConnectedNodes.Contains(toNode.Id))
|
||||
{
|
||||
// 연결되어 있지 않으면 자동 연결
|
||||
CreateConnection(fromNode, toNode);
|
||||
}
|
||||
|
||||
if (fromNode.MagnetDirections == null)
|
||||
fromNode.MagnetDirections = new Dictionary<string, MagnetPosition>();
|
||||
|
||||
if (fromNode.MagnetDirections.ContainsKey(toNode.Id))
|
||||
{
|
||||
fromNode.MagnetDirections[toNode.Id] = direction;
|
||||
}
|
||||
else
|
||||
{
|
||||
fromNode.MagnetDirections.Add(toNode.Id, direction);
|
||||
}
|
||||
|
||||
MapChanged?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user