using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using ChivaXR;
using ChivaXR.Op;
using UnityEngine;
using Sirenix.OdinInspector;
//using UnityEditor.Build.Content;
using ExcelDataReader;
///
/// 快速生成操作
///
public class FastGenerationOperation : MonoBehaviour
{
[BoxGroup("基础数据设定")]
[Title("指定文件路径(Excel文件)")]
[LabelText("文件路径")]
[FilePath(ParentFolder = "", Extensions = "xlsx", AbsolutePath = true)]
[InlineButton("Clear", "清除")]
[SerializeField]
private string m_FilePath;
[BoxGroup("基础数据设定")]
[Title("读取数据设定")]
[LabelText("忽略行数")]
[SerializeField]
private int m_IgnoreRows;
[BoxGroup("基础数据设定")]
[LabelText("加载列数(第一列为默认)")]
[SerializeField]
private int m_SpecifiedNumOfCol;
[BoxGroup("基础数据设定")]
[Title("设定读取当前表格的工作表索引(默认第一张表,即0)")]
[LabelText("工作表索引")]
[SerializeField]
private int m_WorksheetIndex;
[BoxGroup("基础数据设定")]
[Title("根节点设定(为空时表示当前节点为根节点)")]
[LabelText("根节点")]
[SerializeField]
private GameObject m_RootGameObject;
[LabelText("是否自定义名称")]
[InfoBox("默认:num_name,例:001_拧开螺丝")]
[SerializeField]
private bool m_IsCustomName;
[LabelText("是否禁用生成判定")]
[SerializeField]
private bool m_IsDisableDecision;
[ShowIfGroup("m_IsCustomName")]
[BoxGroup("m_IsCustomName/名称设定")]
[InfoBox("范例:第{i}步:")]
[SerializeField]
private string m_NodeName = "第{i}步:";
[Button("清除所有数据(慎用)", ButtonSizes.Large), GUIColor(1, 0, 0)]
private void ClearAllData()
{
Transform targetTransform = GetTargetTransform();
if (targetTransform == null)
{
return;
}
if (targetTransform.GetComponent() != null)
{
ClearAllChild(targetTransform, 1);
}
else
{
ClearAllChild(targetTransform, 0);
}
}
[Button("开始生成", ButtonSizes.Large), GUIColor(0, 1, 0)]
private void StartGeneration()
{
if (string.IsNullOrEmpty(m_FilePath))
{
Debug.Log("指定文件不能为空");
return;
}
Transform targetTransform = GetTargetTransform();
if (targetTransform == null)
{
return;
}
CreateNode(targetTransform);
}
///
/// 获取目标Transform
///
/// 返回目标Transform,若条件不满足则返回null
private Transform GetTargetTransform()
{
Transform targetTransform = m_RootGameObject != null ? m_RootGameObject.transform : transform;
if (!m_IsDisableDecision)
{
if (targetTransform.GetComponent() == null && targetTransform.GetComponent() == null)
{
return null;
}
}
return targetTransform;
}
///
/// 创建节点
///
///
private void CreateNode(Transform _parentNode)
{
List allData = ParseReadData();
if (allData.Count <= 0)
{
return;
}
for (int i = 0; i < allData.Count; i++)
{
string[] lineData = allData[i].Split('|');
if (lineData.Length < m_SpecifiedNumOfCol)
{
return;
}
GameObject tempGameObject = new GameObject();
tempGameObject.name = (!m_IsCustomName
? lineData[0].PadLeft(3, '0') + "_"
: m_NodeName.Replace("{i}", (i + 1).ToString())) + lineData[m_SpecifiedNumOfCol - 1];
tempGameObject.transform.SetParent(_parentNode);
if (_parentNode.GetComponent() != null)
{
AniData tmpData = tempGameObject.AddComponent();
tmpData.aniName = tempGameObject.name;
tmpData.aniDescriptioin = lineData[m_SpecifiedNumOfCol - 1];
}
else if (_parentNode.GetComponent() != null)
{
OpTrigger_ToolPack toolPack = tempGameObject.AddComponent();
toolPack.operationName = tempGameObject.name;
toolPack.operationDescription = lineData[m_SpecifiedNumOfCol - 1];
}
else
{
}
}
}
///
/// 清除路径信息
///
private void Clear()
{
if (string.IsNullOrEmpty(m_FilePath))
{
return;
}
m_FilePath = String.Empty;
}
///
/// 清除所有子对象
///
/// 根节点
/// 忽略索引
private void ClearAllChild(Transform _rootNode, int _ignoreIndex)
{
for (int i = _rootNode.childCount - 1; i >= _ignoreIndex; i--)
{
DestroyImmediate(_rootNode.GetChild(i).gameObject);
}
}
#region Excel文件处理
///
/// 解析读取到的数据
///
///
///
/// 表头数,即不需要进行解析的表头行总数
/// 默认是第一张表
/// 返回总体数据集合,数据的连接符为'|'
private List ParseReadData()
{
DataSet dataSet = null;
using (FileStream fileStream = File.Open(m_FilePath, FileMode.Open, FileAccess.Read))
{
using (IExcelDataReader dataReader = ExcelReaderFactory.CreateReader(fileStream))
{
// 获取整张表数据
dataSet = dataReader.AsDataSet();
}
}
DataTable dataTable = dataSet.Tables[m_WorksheetIndex];
if (dataTable == null)
{
return null;
}
return ParsingTable(dataTable);
}
///
/// 解析表格
///
///
///
/// 文件类型
///
private List ParsingTable(DataTable _dataTable)
{
if (_dataTable == null)
{
return null;
}
List result = new List();
// 获取行数
int rows = _dataTable.Rows.Count;
// 获取列数
int cols = _dataTable.Columns.Count;
string recordRowData = String.Empty;
for (int i = m_IgnoreRows; i < rows; i++)
{
recordRowData = string.Empty;
for (int j = 0; j < cols; j++)
{
recordRowData += _dataTable.Rows[i][j].ToString() + "|";
}
if (!string.IsNullOrEmpty(recordRowData))
{
// 剔除每一行的最后一个分隔符
recordRowData = recordRowData.Remove(recordRowData.Length - 1);
result.Add(recordRowData);
}
}
return result;
}
#endregion
}