152 lines
4.0 KiB
C#
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;
|
|
}
|
|
} |