using ColorMine.ColorSpaces;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using Tango.BL.Builders;
using Tango.BL.Enumerations;
using Tango.BL.Serialization;
namespace Tango.BL.Entities
{
public partial class Rml : RmlBase
{
///
/// Initializes a new instance of the class.
///
public Rml() : base()
{
WhitePointL = 92.1815;
WhitePointA = 2.2555;
WhitePointB = -10.9325;
PliesPerThread = 1;
}
protected override void OnWhitePointLChanged(double whitepointl)
{
base.OnWhitePointLChanged(whitepointl);
UpdateColor();
}
protected override void OnWhitePointAChanged(double whitepointa)
{
base.OnWhitePointAChanged(whitepointa);
UpdateColor();
}
protected override void OnWhitePointBChanged(double whitepointb)
{
base.OnWhitePointBChanged(whitepointb);
UpdateColor();
}
private void UpdateColor()
{
RaisePropertyChanged(nameof(Color));
}
[NotMapped]
[JsonIgnore]
public Color Color
{
get
{
Lab lab = new Lab(WhitePointA, WhitePointA, WhitePointB);
Rgb rgb = lab.To();
return Color.FromRgb((byte)rgb.R, (byte)rgb.G, (byte)rgb.B);
}
}
///
/// Gets or sets the thread head type.
///
[NotMapped]
[JsonIgnore]
public HeadTypes RmlHeadType
{
get
{
return (HeadTypes)HeadType;
}
set
{
HeadType = value.ToInt32();
}
}
///
/// Gets or sets the thread qualification level.
///
[NotMapped]
[JsonIgnore]
public RmlQualifications RmlQualificationLevel
{
get
{
return (RmlQualifications)QualificationLevel;
}
set
{
QualificationLevel = value.ToInt32();
}
}
[NotMapped]
[JsonIgnore]
public String FinalName
{
get
{
return String.IsNullOrWhiteSpace(DisplayName) ? Name : DisplayName;
}
}
[NotMapped]
[JsonIgnore]
public MachineTypes? ForMachineType
{
get
{
return MachineType != null ? (MachineTypes?)MachineType : null;
}
set
{
MachineType = (int?)value;
RaisePropertyChanged(nameof(ForMachineType));
}
}
protected override void OnNameChanged(string name)
{
base.OnNameChanged(name);
RaisePropertyChanged(nameof(FinalName));
}
protected override void OnDisplayNameChanged(string displayname)
{
base.OnDisplayNameChanged(displayname);
RaisePropertyChanged(nameof(FinalName));
}
public ProcessParametersTablesGroup GetActiveProcessGroup()
{
return ProcessParametersTablesGroups.FirstOrDefault(x => x.Active);
}
public Task ToRmlFile(ObservablesContext context)
{
return Task.Factory.StartNew(() =>
{
var rml = new RmlBuilder(context).Set(Guid).WithActiveParametersGroup().WithCCT().WithLiquidFactors().WithSpools().WithRMLExtensions().Build();
String result = rml.ToJson(new EntitySerializationStrategy()
.Include(() => rml.Cct)
.Include(() => rml.Gbd)
.Include(() => rml.Lub)
.Include(() => rml.LiquidTypesRmls)
.Include(() => rml.ProcessParametersTablesGroups)
.Include(() => rml.RmlsSpools)
.Include(() => rml.RmlsExtensions)
.Include(typeof(ProcessParametersTablesGroup).GetProperty(nameof(ProcessParametersTablesGroup.ProcessParametersTables))),
EntitySerializationFlags.IgnoreCollections | EntitySerializationFlags.IgnoreReferenceTypes | EntitySerializationFlags.Indented);
return result;
});
}
public static Task FromRmlFile(ObservablesContext context, String json)
{
return Task.Factory.StartNew(() =>
{
Rml rml = Rml.FromJson(json, new EntitySerializationStrategy(), EntitySerializationFlags.Indented);
if (context.Rmls.Any(x => x.Guid == rml.Guid || x.Name == rml.Name))
{
throw new InvalidOperationException($"Thread {rml.Name} already exist.");
}
if (rml.Cct != null)
{
if (context.Ccts.Any(x => x.Guid == rml.Cct.Guid))
{
rml.Cct = null;
}
}
if (rml.Gbd != null)
{
if (context.Gbds.Any(x => x.Guid == rml.Gbd.Guid))
{
rml.Gbd = null;
}
}
if (rml.Lub != null)
{
if (context.Lubs.Any(x => x.Guid == rml.Lub.Guid))
{
rml.Lub = null;
}
}
rml.LastUpdated = DateTime.UtcNow;
rml.Code = context.Rmls.Max(x => x.Code) + 1;
return rml;
});
}
public async Task GetRequiredBtsrSpoolTension(ObservablesContext db, SpoolType jobSpoolType = null)
{
int tension = 0;
var spoolTypes = await db.SpoolTypes.ToListAsync();
var spoolType = spoolTypes.FirstOrDefault(x => x.Type == SpoolTypes.StandardSpool);
if (jobSpoolType != null)
{
spoolType = jobSpoolType;
}
tension = spoolType != null ? spoolType.BtsrSpoolTension : 0;
var rml_spool = RmlsSpools.FirstOrDefault(x => x.SpoolType.Type == spoolType.Type);
if (rml_spool != null && rml_spool.BtsrSpoolTension.HasValue)
{
tension = rml_spool.BtsrSpoolTension.Value;
}
return tension;
}
#region Dencity and Fiber Count
///
/// Called when the LinearMassDensityUnit has changed.
///
protected override void OnLinearMassDensityUnitChanged(LinearMassDensityUnit linearmassdensityunit)
{
base.OnLinearMassDensityUnitChanged(linearmassdensityunit);
UpdateDencityCount();
UpdateFiberCount();
}
protected override void OnFiberSizeChanged(double fibersize)
{
base.OnFiberSizeChanged(fibersize);
UpdateDencityCount();
UpdateFiberCount();
}
///
/// Called when the PliesPerFiber has changed.
///
protected override void OnPliesPerFiberChanged(Int32 pliesperfiber)
{
base.OnPliesPerFiberChanged(pliesperfiber);
UpdateFiberCount();
}
protected override void OnPliesPerThreadChanged(Int32 pliesperthread)
{
base.OnPliesPerThreadChanged(pliesperthread);
UpdateDencityCount();
UpdateFiberCount();
RaisePropertyChanged(nameof(RMLPlies));
}
private void UpdateDencityCount()
{
RaisePropertyChanged(nameof(DencityCount));
}
private void UpdateFiberCount()
{
RaisePropertyChanged(nameof(FiberCount));
}
[NotMapped]
[JsonIgnore]
public int DencityCount
{
get
{
var count = 0;
if (LinearMassDensityUnit == null || FiberSize==0)
return count;
if (LinearMassDensityUnit.Name== "Tex")
count = Convert.ToInt32(FiberSize) * 9;
if (LinearMassDensityUnit.Name == "DTEX")
count = (int)(Convert.ToInt32(FiberSize) * 0.9);
if (LinearMassDensityUnit.Name == "Ne")
count = (int)(5315 / Convert.ToInt32(FiberSize));
if (LinearMassDensityUnit.Name == "Nm")
count = (int)(9000 / Convert.ToInt32(FiberSize));
if (LinearMassDensityUnit.Name == "Denier")
count = (int)FiberSize;
return PliesPerThread == 0 ? count : count * PliesPerThread;
}
}
[NotMapped]
[JsonIgnore]
public string FiberCount
{
get
{
if (DencityCount == 0)
return "";
double number =( double)PliesPerFiber / DencityCount;
if (number < 1.0 && number >= 0.3)
return "Micro";
if (number < 2.4 && number >= 1.0)
return "Fine";
if (number <= 7.0 && number >= 2.4)
return "Medium";
if (number > 7.0)
return "Coarse";
return "";
}
}
[NotMapped]
[JsonIgnore]
public double GetGramPer1000mLength
{
get
{
//if (LinearMassDensityUnit.Name == "Tex")
// return FiberSize;
//if (LinearMassDensityUnit.Name == "DTEX")
// return (FiberSize /10);
//if (LinearMassDensityUnit.Name == "Ne")
// return (590.5 / FiberSize);
//if (LinearMassDensityUnit.Name == "Nm")
// return (1000 / FiberSize);
//if (LinearMassDensityUnit.Name == "Denier")
// return FiberSize/9;
return DencityCount == 0? (1/9 ): (DencityCount / 9);
}
}
[NotMapped]
[JsonIgnore]
public Plies RMLPlies
{
get { return (Plies)PliesPerThread; }
set
{
base.PliesPerThread = value.ToInt32();
RaisePropertyChangedAuto();
UpdateDencityCount();
UpdateFiberCount();
}
}
#endregion
}
}