Files
HDRobotics/Assets/Scripts/Model/RobotProgram.cs
2025-12-03 21:19:07 +09:00

152 lines
4.0 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System;
using UnityEngine;
/// <summary>
/// 프로그램의 job이름, step정보를 관리하는 클래스
/// </summary>
public class RobotProgram
{
public string ProgramId { get; private set; } // job이름
public List<RobotMoveStep> Steps { get; private set; } // step정보들
public RobotProgram(string programId, string rawTextContent)
{
this.ProgramId = programId;
this.Steps = new List<RobotMoveStep>();
ParseJobContent(rawTextContent);
}
/// <summary>
/// GET 응답(rawText)을 파싱하여 Steps 리스트를 채움
/// </summary>
private void ParseJobContent(string rawText)
{
string[] lines = rawText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in lines)
{
// S<번호>로 시작하고, [좌표]를 포함하는 라인만 파싱
if (line.StartsWith("S") && line.Contains("["))
{
string coordString = ExtractCoordinates(line);
if (!string.IsNullOrEmpty(coordString))
{
Steps.Add(new RobotMoveStep(line, coordString));
}
}
}
Debug.Log($"프로그램 '{ProgramId}' 로드 완료. {Steps.Count}개의 스텝 파싱됨.");
}
/// <summary>
/// 좌표만 추출하는 함수
/// </summary>
/// <param name="line"></param>
/// <returns></returns>
private string ExtractCoordinates(string line)
{
int start = line.IndexOf('[');
int end = line.IndexOf(']');
if (start != -1 && end != -1)
{
return line.Substring(start + 1, end - start -1);
}
return string.Empty;
}
/// <summary>
/// 새 포인트 로컬 캐시에 추가
/// </summary>
public void AddStep(RobotData data, int toolNum)
{
int newStepNum = (Steps.Count > 0) ? Steps.Last().StepNumber + 1 : 1;
string cmd = $"move P,spd=50%,accu=3,tool={toolNum}";
RobotPose newPose = new RobotPose(data);
string line = $"S{newStepNum} {cmd} {newPose.ToString()}";
Steps.Add(new RobotMoveStep(line, ExtractCoordinates(line)));
}
/// <summary>
/// 기존 포인트의 Pose 로컬 캐시에서 수정
/// </summary>
public void UpdateStep(int index, RobotData data)
{
if (index < 0 || index >= Steps.Count)
{
Debug.LogError($"UpdateStep: 잘못된 인덱스 {index}");
return;
}
Steps[index].UpdatePose(new RobotPose(data));
}
/// <summary>
/// 포인트를 로컬 캐시에서 삭제하고 S<번호> 재정렬
/// </summary>
public void DeleteStep(int index)
{
if (index < 0 || index >= Steps.Count)
{
Debug.LogError($"DeleteStep: 잘못된 인덱스 {index}");
return;
}
Steps.RemoveAt(index);
// 스텝 번호 재정렬 (S1, S2, S3...)
for (int i = 0; i < Steps.Count; i++)
{
// MoveCommand는 그대로 유지
Steps[i].UpdateStepNumber(i + 1);
}
}
/// <summary>
/// 포인트를 로컬 캐시에서 전부 삭제
/// </summary>
public void ResetSteps()
{
for (int i = 0; i < Steps.Count; i++)
{
Steps.RemoveAt(i);
}
}
/// <summary>
/// 특정 인덱스의 Pose를 RobotData로 반환
/// </summary>
public RobotData GetStepPose(int index)
{
if (index < 0 || index >= Steps.Count)
{
Debug.LogError($"GetStepPose: 잘못된 인덱스 {index}");
return new RobotData(); // 빈 데이터 반환
}
return Steps[index].Pose.ToRobotData();
}
/// <summary>
/// 모든 Pose를 List<RobotData>로 반환
/// </summary>
public List<RobotData> GetAllStepPoses()
{
return Steps.Select(step => step.Pose.ToRobotData()).ToList();
}
/// <summary>
/// 모든 Step들 반환
/// </summary>
/// <returns></returns>
public List<RobotMoveStep> GetAllSteps()
{
return this.Steps;
}
}