diff options
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.HardwareDesigner/ViewModels')
2 files changed, 413 insertions, 1 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.HardwareDesigner/ViewModels/ComparisonWizardViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.HardwareDesigner/ViewModels/ComparisonWizardViewVM.cs new file mode 100644 index 000000000..801aa0a72 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.HardwareDesigner/ViewModels/ComparisonWizardViewVM.cs @@ -0,0 +1,401 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Tango.BL; +using Tango.BL.Builders; +using Tango.BL.Entities; +using Tango.BL.Enumerations; +using Tango.Core.Commands; +using Tango.CSV; +using Tango.MachineStudio.Common.Notifications; +using Tango.MachineStudio.HardwareDesigner.Comparison; +using Tango.MachineStudio.HardwareDesigner.Report; +using Tango.SharedUI; + +namespace Tango.MachineStudio.HardwareDesigner.ViewModels +{ + public class ComparisonWizardViewVM : DialogViewVM + { + private INotificationProvider _notification; + #region Properties + + private ObservableCollection<HardwareVersion> _hardwareVersions; + public ObservableCollection<HardwareVersion> HardwareVersions + { + get { return _hardwareVersions; } + set { _hardwareVersions = value; RaisePropertyChangedAuto(); } + } + + private HardwareVersion _selectedVersion1; + public HardwareVersion SelectedVersion1 + { + get { return _selectedVersion1; } + set + { + if (value != null && (_selectedVersion1 == null || _selectedVersion1.Guid != value.Guid)) + { + _selectedVersion1 = value; + RaisePropertyChangedAuto(); + OnSelectedVersionChanged(); + } + } + } + + private HardwareVersion _selectedVersion2; + public HardwareVersion SelectedVersion2 + { + get { return _selectedVersion2; } + set + { + if (value != null && (_selectedVersion2 == null || _selectedVersion2.Guid != value.Guid)) + { + _selectedVersion2 = value; + RaisePropertyChangedAuto(); + OnSelectedVersionChanged(); + } + + } + } + + private bool _isShowDifference; + public bool IsShowDifference + { + get { return _isShowDifference; } + set + { + _isShowDifference = value; + RaisePropertyChangedAuto(); + } + } + + private HardwareCompareResult _result; + public HardwareCompareResult Result + { + get + { + return _result; + } + set + { + _result = value; + RaisePropertyChangedAuto(); + InvalidateRelayCommands(); + } + } + + private bool _isRunning; + public bool IsRunning + { + get { return _isRunning; } + set { _isRunning = value; RaisePropertyChangedAuto(); } + } + + #endregion properties + + #region Command + + public RelayCommand GenerateReportCommand { get; set; } + + #endregion + + + #region Constructors + + public ComparisonWizardViewVM(IEnumerable<HardwareVersion> availableVersions, HardwareVersion selectedVersion, INotificationProvider notification) + { + HardwareVersions = new ObservableCollection<HardwareVersion>(availableVersions); + _selectedVersion1 = selectedVersion; + + _isShowDifference = false; + IsRunning = false; + IsShowDifference = true; + _notification = notification; + + GenerateReportCommand = new RelayCommand(GenerateReport, () => Result != null); + } + + #endregion + + #region Report + + private void GenerateReport() + { + SaveFileDialog dlg = new SaveFileDialog(); + dlg.Title = "Save Report"; + dlg.Filter = "CSV Files|*.csv"; + dlg.FileName = $"hw_compare_report__{SelectedVersion1.Name}__vs__{SelectedVersion2.Name}"; + dlg.DefaultExt = ".csv"; + if (dlg.ShowDialog().Value) + { + try + { + CsvFile<ReportModel> csvFile = new CsvFile<ReportModel>(new CsvDestination(dlg.FileName), new CsvDefinition() + { + Columns = new List<String>() + { + "Collection", + "Component", + "Property", + SelectedVersion1.Name, + SelectedVersion2.Name, + }, + }); + + foreach (var collection in Result.Collections.Where(x => x.HasDifferences || !IsShowDifference)) + { + ReportModel model_collection = new ReportModel(); + model_collection.Collection = collection.CollectionName; + csvFile.Append(model_collection); + foreach (var component in collection.Components.Where(x => x.HasDifferences || !IsShowDifference)) + { + ReportModel model_component = new ReportModel(); + + model_component.Component = component.ComponentName; + csvFile.Append(model_component); + foreach (var prop in component.Properties.Where(x => x.IsDifferent || !IsShowDifference)) + { + ReportModel model = new ReportModel(); + model.Property = prop.PropertyName; + model.HW_1 = prop.Value1; + model.HW_2 = prop.Value2; + csvFile.Append(model); + } + } + } + + csvFile.Dispose(); + _notification.ShowInfo("Report generated successfully."); + } + catch (Exception ex) + { + LogManager.Log(ex, "Error generating HW version comparison report."); + _notification.ShowError($"Error generating HW version comparison report.\n{ex.Message}"); + } + } + } + + #endregion + + private async void OnSelectedVersionChanged() + { + if (SelectedVersion1 != null && SelectedVersion2 != null) + { + IsRunning = true; + using (ObservablesContext db = ObservablesContext.CreateDefault()) + { + var h1 = await new HardwareVersionBuilder(db).Set(SelectedVersion1.Guid).WithHardwareComponents().BuildAsync(); + var h2 = await new HardwareVersionBuilder(db).Set(SelectedVersion2.Guid).WithHardwareComponents().BuildAsync(); + + await Task.Factory.StartNew(() => + { + Result = CompareHardwareVersions(h1, h2); + IsRunning = false; + }); + } + } + } + + #region Compare Versions + + private HardwareCompareResult CompareHardwareVersions(HardwareVersion h1, HardwareVersion h2) + { + _result = new HardwareCompareResult(); + _result.Collections.Add(CompareMotorsCollection(h1, h2)); + _result.Collections.Add(CompareDancerCollection(h1, h2)); + _result.Collections.Add(ComparePidControlsCollection(h1, h2)); + _result.Collections.Add(CompareWindersCollection(h1, h2)); + _result.Collections.Add(CompareSpeedSensorsCollection(h1, h2)); + _result.Collections.Add(CompareBlowersCollection(h1, h2)); + _result.Collections.Add(CompareBreakSensorCollection(h1, h2)); + + + return _result; + } + private HardwareComponentCollectionCompareResult CompareMotorsCollection(HardwareVersion h1, HardwareVersion h2) + { + HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult() + { + CollectionName = "MOTORS" + }; + foreach (var motorTypeCode in Enum.GetValues(typeof(HardwareMotorTypes)).Cast<HardwareMotorTypes>()) + { + var motor1 = h1.HardwareMotors.SingleOrDefault(x => x.HardwareMotorType.Code == motorTypeCode.ToInt32()); + var motor2 = h2.HardwareMotors.SingleOrDefault(x => x.HardwareMotorType.Code == motorTypeCode.ToInt32()); + + var componentResult = CompareComponents( + motorTypeCode.ToDescription(), + GetComponentProperties(typeof(HardwareMotorBase)), + motor1, + motor2); + + collection.Components.Add(componentResult); + } + return collection; + } + private HardwareComponentCollectionCompareResult CompareDancerCollection(HardwareVersion h1, HardwareVersion h2) + { + HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult() + { + CollectionName = "DANCERS" + }; + foreach (var dancerTypeCode in Enum.GetValues(typeof(HardwareDancerTypes)).Cast<HardwareDancerTypes>()) + { + var motor1 = h1.HardwareDancers.SingleOrDefault(x => x.HardwareDancerType.Code == dancerTypeCode.ToInt32()); + var motor2 = h2.HardwareDancers.SingleOrDefault(x => x.HardwareDancerType.Code == dancerTypeCode.ToInt32()); + + var componentResult = CompareComponents( + dancerTypeCode.ToDescription(), + GetComponentProperties(typeof(HardwareDancerBase)), + motor1, + motor2); + + collection.Components.Add(componentResult); + } + return collection; + } + private HardwareComponentCollectionCompareResult ComparePidControlsCollection(HardwareVersion h1, HardwareVersion h2) + { + HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult() + { + CollectionName = "PID CONTROLS" + }; + foreach (var pidControlsTypeCode in Enum.GetValues(typeof(HardwarePidControlTypes)).Cast<HardwarePidControlTypes>()) + { + var motor1 = h1.HardwarePidControls.SingleOrDefault(x => x.HardwarePidControlType.Code == pidControlsTypeCode.ToInt32()); + var motor2 = h2.HardwarePidControls.SingleOrDefault(x => x.HardwarePidControlType.Code == pidControlsTypeCode.ToInt32()); + + var componentResult = CompareComponents( + pidControlsTypeCode.ToDescription(), + GetComponentProperties(typeof(HardwarePidControlBase)), + motor1, + motor2); + + collection.Components.Add(componentResult); + } + return collection; + } + private HardwareComponentCollectionCompareResult CompareWindersCollection(HardwareVersion h1, HardwareVersion h2) + { + HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult() + { + CollectionName = "WINDERS" + }; + foreach (var WinderTypeCode in Enum.GetValues(typeof(HardwareWinderTypes)).Cast<HardwareWinderTypes>()) + { + var motor1 = h1.HardwareWinders.SingleOrDefault(x => x.HardwareWinderType.Code == WinderTypeCode.ToInt32()); + var motor2 = h2.HardwareWinders.SingleOrDefault(x => x.HardwareWinderType.Code == WinderTypeCode.ToInt32()); + + var componentResult = CompareComponents( + WinderTypeCode.ToDescription(), + GetComponentProperties(typeof(HardwareWinderBase)), + motor1, + motor2); + + collection.Components.Add(componentResult); + } + return collection; + } + private HardwareComponentCollectionCompareResult CompareSpeedSensorsCollection(HardwareVersion h1, HardwareVersion h2) + { + HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult() + { + CollectionName = "SPEED SENSORS" + }; + foreach (var speedSewnsorsTypeCode in Enum.GetValues(typeof(HardwareSpeedSensorTypes)).Cast<HardwareSpeedSensorTypes>()) + { + var motor1 = h1.HardwareSpeedSensors.SingleOrDefault(x => x.HardwareSpeedSensorType.Code == speedSewnsorsTypeCode.ToInt32()); + var motor2 = h2.HardwareSpeedSensors.SingleOrDefault(x => x.HardwareSpeedSensorType.Code == speedSewnsorsTypeCode.ToInt32()); + + var componentResult = CompareComponents( + speedSewnsorsTypeCode.ToDescription(), + GetComponentProperties(typeof(HardwareSpeedSensorBase)), + motor1, + motor2); + + collection.Components.Add(componentResult); + } + return collection; + } + private HardwareComponentCollectionCompareResult CompareBlowersCollection(HardwareVersion h1, HardwareVersion h2) + { + HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult() + { + CollectionName = "BLOWERS" + }; + foreach (var blowersTypeCode in Enum.GetValues(typeof(HardwareBlowerTypes)).Cast<HardwareBlowerTypes>()) + { + var motor1 = h1.HardwareBlowers.SingleOrDefault(x => x.HardwareBlowerType.Code == blowersTypeCode.ToInt32()); + var motor2 = h2.HardwareBlowers.SingleOrDefault(x => x.HardwareBlowerType.Code == blowersTypeCode.ToInt32()); + + var componentResult = CompareComponents( + blowersTypeCode.ToDescription(), + GetComponentProperties(typeof(HardwareBlowerBase)), + motor1, + motor2); + + collection.Components.Add(componentResult); + } + return collection; + } + private HardwareComponentCollectionCompareResult CompareBreakSensorCollection(HardwareVersion h1, HardwareVersion h2) + { + HardwareComponentCollectionCompareResult collection = new HardwareComponentCollectionCompareResult() + { + CollectionName = "BREAK SENSOR" + }; + foreach (var breakSewnsorsTypeCode in Enum.GetValues(typeof(HardwareBreakSensorTypes)).Cast<HardwareBreakSensorTypes>()) + { + var motor1 = h1.HardwareBreakSensors.SingleOrDefault(x => x.HardwareBreakSensorType.Code == breakSewnsorsTypeCode.ToInt32()); + var motor2 = h2.HardwareBreakSensors.SingleOrDefault(x => x.HardwareBreakSensorType.Code == breakSewnsorsTypeCode.ToInt32()); + + var componentResult = CompareComponents( + breakSewnsorsTypeCode.ToDescription(), + GetComponentProperties(typeof(HardwareBreakSensorBase)), + motor1, + motor2); + + collection.Components.Add(componentResult); + } + return collection; + } + + private HardwareComponentCompareResult CompareComponents(String name, List<PropertyInfo> properties, Object component1, Object component2) + { + HardwareComponentCompareResult result = new HardwareComponentCompareResult(); + result.ComponentName = name; + result.HasComponent1 = component1 != null; + result.HasComponent2 = component2 != null; + + foreach (var prop in properties) + { + var hProp = new HardwareComponentPropertyResult(); + hProp.PropertyName = prop.Name; + hProp.Value1 = component1 != null ? (prop.GetValue(component1) == null ? "" : prop.GetValue(component1).ToString()) : null; + hProp.Value2 = component2 != null ? (prop.GetValue(component2) == null ? "" : prop.GetValue(component2).ToString()) : null; + + result.Properties.Add(hProp); + } + + return result; + } + private List<PropertyInfo> GetComponentProperties(Type componentType) + { + List<String> exclude = new List<string>() + { + "Guid", + "ID", + "LastUpdated", + "Parameters", + }; + + return componentType.GetProperties(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public).Where(x => !x.PropertyType.IsClass && !exclude.Contains(x.Name)).ToList(); + } + + #endregion + } +} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.HardwareDesigner/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.HardwareDesigner/ViewModels/MainViewVM.cs index 6cc8289f4..918eb02d4 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.HardwareDesigner/ViewModels/MainViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.HardwareDesigner/ViewModels/MainViewVM.cs @@ -13,6 +13,7 @@ using Tango.SharedUI.Components; using System.Runtime.CompilerServices; using Tango.MachineStudio.Common; using Tango.Core.ExtensionMethods; +using Tango.MachineStudio.HardwareDesigner.Views; namespace Tango.MachineStudio.HardwareDesigner.ViewModels { @@ -86,7 +87,7 @@ namespace Tango.MachineStudio.HardwareDesigner.ViewModels return name; } } - + private ObservableCollection<HardwareVersion> _hardwareVersions; public ObservableCollection<HardwareVersion> HardwareVersions { @@ -104,6 +105,8 @@ namespace Tango.MachineStudio.HardwareDesigner.ViewModels public RelayCommand CopyParametersCommand { get; set; } + public RelayCommand OpenComparisonWizardCommand { get; set; } + public MainViewVM(INotificationProvider notification) { _notification = notification; @@ -118,6 +121,8 @@ namespace Tango.MachineStudio.HardwareDesigner.ViewModels CopyParametersCommand = new RelayCommand(CopyParameters, (x) => SelectedVersion != null && IsFree); CloneCommand = new RelayCommand(CloneCurrentVersion, () => SelectedVersion != null && IsFree); + + OpenComparisonWizardCommand = new RelayCommand(OpenComparisonWizard); } public override void OnApplicationReady() @@ -428,6 +433,12 @@ namespace Tango.MachineStudio.HardwareDesigner.ViewModels } } + private void OpenComparisonWizard() + { + ComparisonWizardViewVM vm = new ComparisonWizardViewVM(HardwareVersions, SelectedVersion, _notification); + _notification.ShowModalDialog<ComparisonWizardViewVM, ComparisonWizardView>(vm, (x) => { }, () => { }); + } + protected override void RaisePropertyChangedAuto([CallerMemberName] string caller = null) { base.RaisePropertyChangedAuto(caller); |
