using System.Text.Json.Nodes;
using SharpDX;
using SparkClient.Views.UserControl.ViewportData.Entity;
using SparkClient.Views.UserControl.ViewportData.Enum;
using SparkClient.Views.UserControl.ViewportData.Helper;
namespace SparkClient.Views.UserControl.ViewportData;
public class ViewportData
{
///
/// 钻石编码
///
public String DiamondCode { get; set; }
///
/// 钻石数据
///
public String DiamondData { get; set; }
public ColorConfigEntity ColorConfig { get; set; } = new ColorConfigEntity();
///
/// 初始化构造
///
/// 钻石编码
/// 钻石数据
public ViewportData(string diamondCode, string diamondData)
{
DiamondCode = diamondCode;
DiamondData = diamondData;
}
///
/// 初始化构造
///
/// 钻石编码
/// 钻石数据
public ViewportData(string diamondCode, string diamondData, ColorConfigEntity colorConfig)
{
DiamondCode = diamondCode;
DiamondData = diamondData;
ColorConfig = colorConfig;
}
///
/// 空白构造
///
public ViewportData()
{
}
public void LoadData()
{
JsonNode? json = null;
try
{
json = JsonNode.Parse(DiamondData);
}
catch
{
throw new Exception("DiamondData is invalid");
}
if(json == null) throw new Exception("DiamondData is invalid");
try
{
List facets = new List();
if (json.AsObject()["facets"] != null)
{
JsonArray jsonArray = json.AsObject()["facets"].AsArray();
foreach (var item in jsonArray)
{
var value = CommonHelper.CreateByJsonStr(item.ToString());
facets.Add(value);
}
}
else
{
throw new Exception("facets is invalid");
}
if (json.AsObject()["positive_direction"] != null)
{
JsonObject positive = json.AsObject()["positive_direction"].AsObject();
ViewportManager.PositiveDirection.X = float.Parse(positive["x"]?.ToString() ?? "1.0");
ViewportManager.PositiveDirection.Y = float.Parse(positive["z"]?.ToString() ?? "0");
ViewportManager.PositiveDirection.Z = float.Parse(positive["y"]?.ToString() ?? "0");
}
else
{
ViewportManager.PositiveDirection.X = 1.0f;
ViewportManager.PositiveDirection.Y = 0f;
ViewportManager.PositiveDirection.Z = 0;
}
var measurements = json.AsObject()["measurements"];
ViewportManager.DiamondData = measurements==null?new JsonObject():measurements.AsObject();
var midZ = facets.SelectMany(e => new[] { e.Point1.X, e.Point2.X, e.Point3.X }).OrderBy(z => Math.Abs(z))
.First();
List facetsFinal = new List();
foreach (var item in facets)
{
var data = ViewportHelperPro.VectorClockwiseSort(new List
{ item.Point1, item.Point2, item.Point3 });
if (item.PlaneType == PlaneType.StarFacet || item.PlaneType == PlaneType.UpperGirdleFacet ||
item.PlaneType == PlaneType.UpperMainFacet || item.PlaneType == PlaneType.TableFacet)
{
item.Point1 = data[0];
item.Point2 = data[1];
item.Point3 = data[2];
}
else if (item.PlaneType == PlaneType.Girdle)
{
var center = ViewportHelperPro.GetCentroid(data);
data.Sort((v1, v2) =>
{
double angle1 = Math.Atan2(v1.Y - center.Y, v1.X - center.X);
double angle2 = Math.Atan2(v2.Y - center.Y, v2.X - center.X);
return angle1.CompareTo(angle2);
});
if (center.Z >= midZ)
{
item.Point1 = data[0];
item.Point2 = data[1];
item.Point3 = data[2];
}
else
{
item.Point1 = data[2];
item.Point2 = data[1];
item.Point3 = data[0];
}
}
else
{
item.Point1 = data[2];
item.Point2 = data[1];
item.Point3 = data[0];
}
item.TriangleCode = CommonHelper.GenerateTriangleCode(item.Point1, item.Point2, item.Point3);
facetsFinal.Add(item);
}
if (json["status"].ToString().Equals("P021"))
{
ViewportManager.isUglyDiamond = true;
}
else
{
ViewportManager.isUglyDiamond = false;
}
ViewportManager.ViewportTriangle.Clear();
ViewportManager.ViewportTriangle.AddRange(facetsFinal);
ViewportManager.ColorConfig = ColorConfig;
// ViewportManager.LoadModelByEntities(facetsFinal);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public async Task SaveAsToStlFile(string filename)
{
try
{
await ViewportHelperPro.ExportModelsToStlASync(filename);
return ;
}
catch
{
return ;
}
}
public async Task SaveAsToVedioFile(string filename)
{
try
{
await ViewportHelperPro.ExportModelsToVideo(null, filename);
}
catch
{
return ;
}
}
public bool ConvertMp4ToDat(string mp4FilePath, string datFilePath)
{
try
{
VideoHelper.ConvertMp4ToDat(datFilePath, mp4FilePath);
return true;
}
catch
{
return false;
}
}
public void mockSel(string planKey)
{
ViewportManager.MockSelectFacet(planKey);
}
}