134 lines
4.1 KiB
C#
134 lines
4.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
|
|
namespace AZTECHWB
|
|
{
|
|
[Serializable]
|
|
public class StandardInfo
|
|
{
|
|
public string code;
|
|
public string name;
|
|
public string[] filterInfo;
|
|
}
|
|
public class LibraryManager : MonoBehaviour
|
|
{
|
|
public string sceneName;
|
|
private string machineInfoPath = "MachineStandardInfo.csv";
|
|
private Machine[] machines;
|
|
|
|
public List<StandardInfo> standardInfos = new();
|
|
public string[] machineFilters;
|
|
public Action<string[]> onUpdateMachineFilters;
|
|
|
|
public Action<HashSet<Machine>> onLibraryFilterigComplete;
|
|
public Action<HashSet<Machine>> onAllMachinesReady;
|
|
public HashSet<Machine> filteringMachine = new();
|
|
public Action<UI_LibraryButton> onClickButton;
|
|
|
|
public void Awake()
|
|
{
|
|
var path = $"./{machineInfoPath }";
|
|
ReadStandardInfo(new string[] { path });
|
|
}
|
|
public void Start()
|
|
{
|
|
MatchingMachine(standardInfos, machineFilters);
|
|
}
|
|
|
|
string[] ReadRawFile(string path, char separator)
|
|
{
|
|
FileInfo fileInfo = new FileInfo(path);
|
|
using (var fs = fileInfo.OpenRead())
|
|
{
|
|
var length = fs.Length;
|
|
var buffer = new byte[length];
|
|
fs.Read(buffer, 0, buffer.Length);
|
|
string str = System.Text.Encoding.Default.GetString(buffer);
|
|
return str.Split(separator);
|
|
}
|
|
}
|
|
|
|
void ReadStandardInfo(string[] file)
|
|
{
|
|
var path = file[0];
|
|
var rawData = ReadRawFile(path, '\n');
|
|
|
|
standardInfos.Clear();
|
|
bool warningChecker = false;
|
|
HashSet<string> filterSet = new();
|
|
for (int i = 1; i < rawData.Length - 1; ++i)
|
|
{
|
|
var r = rawData[i];
|
|
var data = r.Split(',');
|
|
if (data.Length < 2)
|
|
{
|
|
return;
|
|
}
|
|
var code = data[0];
|
|
var name = data[1];
|
|
if (code == "" || name == "")
|
|
{
|
|
warningChecker = true;
|
|
break;
|
|
}
|
|
|
|
data = data[2..];
|
|
|
|
int prevLength = data.Length;
|
|
data = data.Distinct().Where(d => d != "" && d != "\r").ToArray();
|
|
for (int a = 0; a < data.Length; ++a)
|
|
{
|
|
data[a] = data[a].Replace('\r', ' ');
|
|
}
|
|
|
|
var standardInfo = new StandardInfo() { code = code, name = name, filterInfo = data };
|
|
|
|
foreach (var f in standardInfo.filterInfo)
|
|
{
|
|
if (f != "")
|
|
filterSet.Add(f);
|
|
}
|
|
|
|
standardInfos.Add(standardInfo);
|
|
}
|
|
if (warningChecker)
|
|
{
|
|
return;
|
|
}
|
|
machineFilters = filterSet.ToArray();
|
|
}
|
|
|
|
public void MatchingMachine(List<StandardInfo> standardInfos, string[] machineFilters)
|
|
{
|
|
var building = FindAnyObjectByType<Building>();
|
|
machines = building.floors.SelectMany(f => f.machines).ToArray();
|
|
foreach (var info in standardInfos)
|
|
{
|
|
var p = machines.Where(x => x.machineName.Equals(info.code)).FirstOrDefault();
|
|
if (p == null)
|
|
continue;
|
|
p.typeOptions = info.filterInfo;
|
|
}
|
|
onUpdateMachineFilters?.Invoke(machineFilters);
|
|
onAllMachinesReady?.Invoke(machines.ToHashSet());
|
|
}
|
|
|
|
public void LibraryFiltering(string options)
|
|
{
|
|
filteringMachine.Clear();
|
|
foreach (var machine in machines)
|
|
{
|
|
if (machine.typeOptions.Contains(options))
|
|
{
|
|
filteringMachine.Add(machine);
|
|
}
|
|
}
|
|
onLibraryFilterigComplete?.Invoke(filteringMachine);
|
|
}
|
|
}
|
|
}
|
|
|