aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Popups/MethodPopup.cs
blob: 7c431f9b4ddb9c633005c3f40a882f376e9f642f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Tango.Scripting.Editors.Popups
{
    public class MethodPopup : Control
    {
        public List<MethodDescription> Methods { get; set; }

        public int CurrentMethodIndex
        {
            get { return (int)GetValue(CurrentMethodIndexProperty); }
            set { SetValue(CurrentMethodIndexProperty, value); }
        }
        public static readonly DependencyProperty CurrentMethodIndexProperty =
            DependencyProperty.Register("CurrentMethodIndex", typeof(int), typeof(MethodPopup), new PropertyMetadata(1));

        public MethodDescription CurrentMethod
        {
            get { return (MethodDescription)GetValue(CurrentMethodProperty); }
            set { SetValue(CurrentMethodProperty, value); }
        }
        public static readonly DependencyProperty CurrentMethodProperty =
            DependencyProperty.Register("CurrentMethod", typeof(MethodDescription), typeof(MethodPopup), new PropertyMetadata(null));

        public void IncrementMethod()
        {
            if (Methods.Count > 0)
            {
                if (CurrentMethodIndex < Methods.Count)
                {
                    CurrentMethodIndex++;
                    CurrentMethod = Methods[CurrentMethodIndex - 1];
                }
                else
                {
                    CurrentMethodIndex = 1;
                    CurrentMethod = Methods[0];
                }
            }
        }

        public void DecrementMethod()
        {
            if (Methods.Count > 0)
            {
                if (CurrentMethodIndex > 1)
                {
                    CurrentMethodIndex--;
                    CurrentMethod = Methods[CurrentMethodIndex - 1];
                }
                else
                {
                    CurrentMethodIndex = Methods.Count;
                    CurrentMethod = Methods[Methods.Count - 1];
                }
            }
        }

        public MethodPopup()
        {
            Methods = new List<MethodDescription>();
        }

        static MethodPopup()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MethodPopup), new FrameworkPropertyMetadata(typeof(MethodPopup)));
        }
    }
}
ass="w"> 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 { /// <summary> /// class ComparisonWizardViewVM is view model of dialog for compare properties of 2 hardware versions /// </summary> /// <seealso cref="Tango.SharedUI.DialogViewVM" /> public class ComparisonWizardViewVM : DialogViewVM { private INotificationProvider _notification; #region Properties private ObservableCollection<HardwareVersion> _hardwareVersions; /// <summary> /// Gets or sets the hardware versions. Contains all available versions. /// </summary> /// <value> /// The hardware versions. /// </value> public ObservableCollection<HardwareVersion> HardwareVersions { get { return _hardwareVersions; } set { _hardwareVersions = value; RaisePropertyChangedAuto(); } } private HardwareVersion _selectedVersion1; /// <summary> /// Gets or sets the selected version1 contains selected value from left combo box /// </summary> /// <value> /// The selected version1. /// </value> public HardwareVersion SelectedVersion1 { get { return _selectedVersion1; } set { if (value != null && (_selectedVersion1 == null || _selectedVersion1.Guid != value.Guid)) { _selectedVersion1 = value; RaisePropertyChangedAuto(); OnSelectedVersionChanged(); } } } private HardwareVersion _selectedVersion2; /// <summary> /// Gets or sets the selected version2 contains selected value from right combo box /// </summary> /// <value> /// The selected version2. /// </value> public HardwareVersion SelectedVersion2 { get { return _selectedVersion2; } set { if (value != null && (_selectedVersion2 == null || _selectedVersion2.Guid != value.Guid)) { _selectedVersion2 = value; RaisePropertyChangedAuto(); OnSelectedVersionChanged(); } } } private bool _isShowDifference; /// <summary> /// Gets or sets a value indicating whether this instance is show difference. Binding to value of checkbox in GUI. /// </summary> /// <value> /// <c>true</c> if this instance is show difference; otherwise, <c>false</c>. /// </value> public bool IsShowDifference { get { return _isShowDifference; } set { _isShowDifference = value; RaisePropertyChangedAuto(); } } private HardwareCompareResult _result; /// <summary> /// Gets or sets the result. Contains result of the comparison properties from selected versions. /// </summary> /// <value> /// The result. /// </value> 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 /// <summary> /// Generates the report. Save properties in .csv file in format Collection name/Component name/Property name/Value1 of version1/Value2 of version 2 /// </summary> 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.HasDifferences || !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 #region Selected Version Changed 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; }); } } } #endregion #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); } collection.Components = collection.Components.OrderByAlphaNumeric(x => x.ComponentName).ToSynchronizedObservableCollection(); 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); } collection.Components = collection.Components.OrderByAlphaNumeric(x => x.ComponentName).ToSynchronizedObservableCollection(); 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); } collection.Components = collection.Components.OrderByAlphaNumeric(x => x.ComponentName).ToSynchronizedObservableCollection(); 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); } collection.Components = collection.Components.OrderByAlphaNumeric(x => x.ComponentName).ToSynchronizedObservableCollection(); 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); } collection.Components = collection.Components.OrderByAlphaNumeric(x => x.ComponentName).ToSynchronizedObservableCollection(); 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); } collection.Components = collection.Components.OrderByAlphaNumeric(x => x.ComponentName).ToSynchronizedObservableCollection(); 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); } collection.Components = collection.Components.OrderByAlphaNumeric(x => x.ComponentName).ToSynchronizedObservableCollection(); 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 } }