123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- using System;
- using System.Collections.Generic;
- namespace InABox.Core
- {
- public abstract class Dimensions<TLink,TUnit> : BaseObject, IEnclosedEntity, IDimensions
- where TLink : DimensionUnitLink<TUnit>, new()
- where TUnit : DimensionUnit, new()
- {
-
- [EditorSequence(1)]
- [RequiredColumn]
- [Caption("Sizing", IncludePath = false)]
- public abstract TLink Unit { get; set; }
- public IDimensionUnit GetUnit() => Unit;
-
- [DoubleEditor(Visible = Visible.Hidden)]
- [EditorSequence(2)]
- [Caption("Quantity", IncludePath = false)]
- public abstract double Quantity { get; set; }
-
- [DoubleEditor(Visible = Visible.Hidden)]
- [EditorSequence(3)]
- [Caption("Length", IncludePath = false)]
- public abstract double Length { get; set; }
-
- [DoubleEditor(Visible = Visible.Hidden)]
- [EditorSequence(4)]
- [Caption("Width", IncludePath = false)]
- public abstract double Width { get; set; }
-
- [DoubleEditor(Visible = Visible.Hidden)]
- [EditorSequence(5)]
- [Caption("Height", IncludePath = false)]
- public abstract double Height { get; set; }
-
- [DoubleEditor(Visible = Visible.Hidden)]
- [EditorSequence(6)]
- [Caption("Weight", IncludePath = false)]
- public abstract double Weight { get; set; }
-
- [DoubleEditor(Visible = Visible.Optional, Editable = Editable.Hidden)]
- [Caption("Value", IncludePath = false)]
- [EditorSequence(7)]
- public abstract double Value { get; set; }
-
- [TextBoxEditor(Visible = Visible.Default, Editable=Editable.Hidden)]
- [EditorSequence(8)]
- [Caption("Unit Size", IncludePath = false)]
- public abstract String UnitSize { get; set; }
-
- protected override void Init()
- {
- base.Init();
- Unit = new TLink();
- Unit.PropertyChanged += (sender, args) =>
- {
- var unit = sender as DimensionUnitLink<TUnit>;
- DoPropertyChanged(
- String.Format("Unit.{0}",args.PropertyName),
- unit.GetOriginalValue<DimensionUnitLink<TUnit>,object>(args.PropertyName),
- CoreUtils.GetPropertyValue(unit,args.PropertyName));
- };
- }
-
- private bool bCalculating = false;
- private static Column<Dimensions<TLink,TUnit>> unitid = new Column<Dimensions<TLink,TUnit>>(x => x.Unit.ID);
- private static Column<Dimensions<TLink,TUnit>> quantity = new Column<Dimensions<TLink,TUnit>>(x => x.Quantity);
- private static Column<Dimensions<TLink,TUnit>> length = new Column<Dimensions<TLink,TUnit>>(x => x.Length);
- private static Column<Dimensions<TLink,TUnit>> width = new Column<Dimensions<TLink,TUnit>>(x => x.Width);
- private static Column<Dimensions<TLink,TUnit>> height = new Column<Dimensions<TLink,TUnit>>(x => x.Height);
- private static Column<Dimensions<TLink,TUnit>> weight = new Column<Dimensions<TLink,TUnit>>(x => x.Weight);
- private static Column<Dimensions<TLink,TUnit>> sizeformula = new Column<Dimensions<TLink,TUnit>>(x => x.Unit.Formula);
- private static Column<Dimensions<TLink,TUnit>> sizeformat = new Column<Dimensions<TLink,TUnit>>(x => x.Unit.Format);
-
- protected override void DoPropertyChanged(string name, object before, object after)
- {
- base.DoPropertyChanged(name, before, after);
- if (bCalculating)
- return;
-
- bCalculating = true;
-
- try
- {
-
- if (unitid.IsEqualTo(name))
- Calculate(Quantity, Length, Width, Height, Weight, Unit.Formula, Unit.Format);
- else if (quantity.IsEqualTo(name))
- Calculate(after, Length, Width, Height, Weight, Unit.Formula, Unit.Format);
- else if (length.IsEqualTo(name))
- Calculate(Quantity, after, Width, Height, Weight, Unit.Formula, Unit.Format);
- else if (width.IsEqualTo(name))
- Calculate(Quantity, Length, after, Height, Weight, Unit.Formula, Unit.Format);
- else if (height.IsEqualTo(name))
- Calculate(Quantity, Length, Width, after, Weight, Unit.Formula, Unit.Format);
- else if (weight.IsEqualTo(name))
- Calculate(Quantity, Length, Width, Height, after, Unit.Formula, Unit.Format);
- else if (sizeformula.IsEqualTo(name))
- Calculate(Quantity, Length, Width, Height, Weight, (string)after, Unit.Format);
- else if (sizeformat.IsEqualTo(name))
- Calculate(Quantity, Length, Width, Height, Weight, Unit.Formula, (string)after);
- }
- finally
- {
- bCalculating = false;
- }
- }
- public void Set(IDimensionUnit unit, double quantity, double length, double width, double height, double weight)
- {
- bCalculating = true;
- try
- {
- Unit.ID = unit.ID;
- Unit.HasQuantity = unit.HasQuantity;
- Unit.HasLength = unit.HasLength;
- Unit.HasWidth = unit.HasWidth;
- Unit.HasHeight = unit.HasHeight;
- Unit.HasWeight = unit.HasWeight;
- Unit.Code = unit.Code;
- Unit.Description = unit.Description;
- Unit.Formula = unit.Formula;
- Unit.Format = unit.Format;
- Quantity = quantity;
- Length = length;
- Width = width;
- Height = height;
- Weight = weight;
- Calculate(quantity, length, width, height, weight, unit.Formula, unit.Format);
- }
- finally
- {
- bCalculating = false;
- }
- }
-
- private void Calculate(object quantity, object length, object width, object height, object weight, String formula, String format)
- {
- if (Evaluate<double>(formula, quantity, length, width, height, weight, out double value))
- Value = value;
- if (Evaluate<String>(format, quantity, length, width, height, weight, out string unitsize))
- UnitSize = unitsize;
- }
- private bool Evaluate<T>(String formula, object quantity, object length, object width, object height, object weight, out T result)
- {
-
- if (!String.IsNullOrWhiteSpace(formula))
- {
- var variables = new Dictionary<string, object?>()
- {
- { "Quantity", Convert.ToDouble(quantity) },
- { "Length", Convert.ToDouble(length) },
- { "Width", Convert.ToDouble(width) },
- { "Height", Convert.ToDouble(height) },
- { "Weight", Convert.ToDouble(weight) }
- };
- try
- {
- var expr = new CoreExpression(formula);
- var eval = expr.Evaluate(variables);
- result = (T)CoreUtils.ChangeType(eval,typeof(T));
- return true;
- }
- catch (Exception e)
- {
- Logger.Send(LogType.Information, "", String.Format("Error in Formula: [{0}] ({1})", formula, e.Message));
- result = default(T);
- return false;
- }
- }
- result = default(T);
- return true;
- }
- public void CopyFrom(IDimensions source)
- {
- SetObserving(false);
- Unit.ID = source.GetUnit().ID;
- Unit.Synchronise(source.GetUnit());
- Quantity = source.Quantity;
- Length = source.Length;
- Width = source.Width;
- Height = source.Height;
- Weight = source.Weight;
- Value = source.Value;
- UnitSize = source.UnitSize;
- SetObserving(true);
- }
- }
- }
|