rabidus-test/Assets/Dreamteck/Splines/Core/IO/CSV.cs

1 line
9.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;using System.Collections.Generic;using UnityEngine;using System.IO;using System.Text.RegularExpressions;namespace Dreamteck.Splines.IO{ public class CSV : SplineParser { public enum ColumnType { Position, Tangent, Tangent2, Normal, Size, Color } public List<ColumnType> columns = new List<ColumnType>(); private System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-US"); private System.Globalization.NumberStyles style = System.Globalization.NumberStyles.Any; public CSV(SplineComputer computer) { Spline spline = new Spline(computer.type, computer.sampleRate); spline.points = computer.GetPoints(); if (spline.type != Spline.Type.Bezier && spline.type != Spline.Type.Linear) spline.CatToBezierTangents(); if (computer.isClosed) spline.Close(); buffer = new SplineDefinition(computer.name, spline); fileName = computer.name; columns.Add(ColumnType.Position); columns.Add(ColumnType.Tangent); columns.Add(ColumnType.Tangent2); } public CSV(string filePath, List<ColumnType> customColumns = null) { if (File.Exists(filePath)) { string ext = Path.GetExtension(filePath).ToLower(); fileName = Path.GetFileNameWithoutExtension(filePath); if (ext != ".csv") { Debug.LogError("CSV Parsing ERROR: Wrong format. Please use SVG or XML"); return; } string[] lines = File.ReadAllLines(filePath); if (customColumns == null) { columns.Add(ColumnType.Position); columns.Add(ColumnType.Tangent); columns.Add(ColumnType.Tangent2); columns.Add(ColumnType.Normal); columns.Add(ColumnType.Size); columns.Add(ColumnType.Color); } else columns = new List<ColumnType>(customColumns); buffer = new SplineDefinition(fileName, Spline.Type.CatmullRom); Read(lines); } } void Read(string[] lines) { int expectedElementCount = 0; foreach (ColumnType col in columns) { switch (col) { case ColumnType.Position: expectedElementCount +=3; break; case ColumnType.Tangent: expectedElementCount += 3; break; case ColumnType.Tangent2: expectedElementCount += 3; break; case ColumnType.Normal: expectedElementCount += 3; break; case ColumnType.Size: expectedElementCount ++; break; case ColumnType.Color: expectedElementCount += 4; break; } } for (int i = 1; i < lines.Length; i++) { lines[i] = Regex.Replace(lines[i], @"\s+", ""); string[] elements = lines[i].Split(','); if(elements.Length != expectedElementCount) { Debug.LogError("Unexpected element count on row " + i + ". Expected " + expectedElementCount + " found " + elements.Length + " Please make sure that all values exist and the column order is correct."); continue; } float[] values = new float[elements.Length]; for (int j = 0; j < elements.Length; j++) { float.TryParse(elements[j], style, culture, out values[j]); } int currentValue = 0; foreach (ColumnType col in columns) { switch (col) { case ColumnType.Position: buffer.position = new Vector3(values[currentValue++], values[currentValue++], values[currentValue++]); break; case ColumnType.Tangent: buffer.tangent = new Vector3(values[currentValue++], values[currentValue++], values[currentValue++]); break; case ColumnType.Tangent2: buffer.tangent2 = new Vector3(values[currentValue++], values[currentValue++], values[currentValue++]); break; case ColumnType.Normal: buffer.normal = new Vector3(values[currentValue++], values[currentValue++], values[currentValue++]); break; case ColumnType.Size: buffer.size = values[currentValue++]; break; case ColumnType.Color: buffer.color = new Color(values[currentValue++], values[currentValue++], values[currentValue++], values[currentValue++]); break; } } buffer.CreateSmooth(); } } public SplineComputer CreateSplineComputer(Vector3 position, Quaternion rotation) { return buffer.CreateSplineComputer(position, rotation); } public Spline CreateSpline() { return buffer.CreateSpline(); } public void FlatX() { for (int i = 0; i < buffer.pointCount; i++) { buffer.points[i].Flatten(LinearAlgebraUtility.Axis.X); } } public void FlatY() { for (int i = 0; i < buffer.pointCount; i++) { buffer.points[i].Flatten(LinearAlgebraUtility.Axis.Y); } } public void FlatZ() { for (int i = 0; i < buffer.pointCount; i++) { buffer.points[i].Flatten(LinearAlgebraUtility.Axis.Z); } } void AddTitle(ref string[] content, string title) { if (!string.IsNullOrEmpty(content[0])) content[0] += ","; content[0] += title; } void AddVector3Title(ref string[] content, string prefix) { AddTitle(ref content, prefix + "X," + prefix + "Y," + prefix + "Z"); } void AddColorTitle(ref string[] content, string prefix) { AddTitle(ref content, prefix + "R," + prefix + "G," + prefix + "B" + prefix + "A"); } void AddVector3(ref string[] content, int index, Vector3 vector) { AddFloat(ref content, index, vector.x); AddFloat(ref content, index, vector.y); AddFloat(ref content, index, vector.z); } void AddColor(ref string[] content, int index, Color color) { AddFloat(ref content, index, color.r); AddFloat(ref content, index, color.g); AddFloat(ref content, index, color.b); AddFloat(ref content, index, color.a); } void AddFloat(ref string[] content, int index, float value) { if (!string.IsNullOrEmpty(content[index])) content[index] += ","; content[index] += value.ToString(); } public void Write(string filePath) { if (!Directory.Exists(Path.GetDirectoryName(filePath))) throw new DirectoryNotFoundException("The file is being saved to a non-existing directory."); List<SplinePoint> csvPoints = buffer.points; string[] content = new string[csvPoints.Count+1]; //Add the column titles foreach(ColumnType col in columns) { switch (col) { case ColumnType.Position: AddVector3Title(ref content, "Position"); break; case ColumnType.Tangent: AddVector3Title(ref content, "Tangent"); break; case ColumnType.Tangent2: AddVector3Title(ref content, "Tangent2"); break; case ColumnType.Normal: AddVector3Title(ref content, "Normal"); break; case ColumnType.Size: AddTitle(ref content, "Size"); break; case ColumnType.Color: AddColorTitle(ref content, "Color"); break; } } //Add the content for each column foreach (ColumnType col in columns) { for (int i = 1; i <= csvPoints.Count; i++) { int index = i - 1; switch (col) { case ColumnType.Position: AddVector3(ref content, i, csvPoints[index].position); break; case ColumnType.Tangent: AddVector3(ref content, i, csvPoints[index].tangent); break; case ColumnType.Tangent2: AddVector3(ref content, i, csvPoints[index].tangent2); break; case ColumnType.Normal: AddVector3(ref content, i, csvPoints[index].normal); break; case ColumnType.Size: AddFloat(ref content, i, csvPoints[index].size); break; case ColumnType.Color: AddColor(ref content, i, csvPoints[index].color); break; } } } File.WriteAllLines(filePath, content); } }}