aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/ConnectedMachineViewVM.cs
blob: 302c50e8ea2ada32c7c400c2d4e4b1a95c67773a (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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.BL;
using Tango.BL.Entities;
using Tango.Core.Commands;
using Tango.MachineStudio.Common.Diagnostics;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.Common.StudioApplication;
using Tango.SharedUI;
using System.Data.Entity;

namespace Tango.MachineStudio.UI.ViewModels
{
    public class ConnectedMachineViewVM : DialogViewVM
    {
        public enum ConnectedMachineVMResult
        {
            Cancel,
            Disconnect,
            UploadHardwareConfig,
            Reset,
            TurnOffHeaters
        }

        private IStudioApplicationManager _applicationManager;
        public IStudioApplicationManager ApplicationManager
        {
            get { return _applicationManager; }
            set { _applicationManager = value; RaisePropertyChangedAuto(); }
        }

        public ConnectedMachineVMResult Result { get; set; }

        private IDiagnosticsFrameProvider _diagnosticsFrameProvider;
        public IDiagnosticsFrameProvider DiagnosticsFrameProvider
        {
            get { return _diagnosticsFrameProvider; }
            set { _diagnosticsFrameProvider = value; RaisePropertyChangedAuto(); }
        }

        private String _totalMachineWorkTime;
        public String TotalMachineWorkTime
        {
            get { return _totalMachineWorkTime; }
            set { _totalMachineWorkTime = value; RaisePropertyChangedAuto(); }
        }

        private String _totalMachineMeters;
        public String TotalMachineMeters
        {
            get { return _totalMachineMeters; }
            set { _totalMachineMeters = value; RaisePropertyChangedAuto(); }
        }

        public RelayCommand DisconnectCommand { get; set; }

        public RelayCommand UploadHardwareConfigurationCommand { get; set; }

        public RelayCommand ResetCommand { get; set; }

        public RelayCommand TurnOffHeatersCommand { get; set; }

        public ConnectedMachineViewVM(IStudioApplicationManager application, IDiagnosticsFrameProvider frameProvider)
        {
            ApplicationManager = application;
            DisconnectCommand = new RelayCommand(() => AcceptResult(ConnectedMachineVMResult.Disconnect));
            UploadHardwareConfigurationCommand = new RelayCommand(() => AcceptResult(ConnectedMachineVMResult.UploadHardwareConfig));
            ResetCommand = new RelayCommand(() => AcceptResult(ConnectedMachineVMResult.Reset));
            TurnOffHeatersCommand = new RelayCommand(() => AcceptResult(ConnectedMachineVMResult.TurnOffHeaters));

            DiagnosticsFrameProvider = frameProvider;
        }

        private void AcceptResult(ConnectedMachineVMResult result)
        {
            Result = result;
            Accept();
        }

        public override void OnShow()
        {
            base.OnShow();
            LoadMachineCounters();
        }

        private async void LoadMachineCounters()
        {
            try
            {
                TotalMachineMeters = "loading...";
                TotalMachineWorkTime = "loading...";

                using (ObservablesContext db = ObservablesContext.CreateDefault())
                {
                    var jobRuns = await db.JobRuns.Where(x => x.MachineGuid == ApplicationManager.Machine.Guid).Select(x => new { x.StartDate, x.EndDate, x.EndPosition }).ToListAsync();

                    TotalMachineWorkTime = TimeSpan.FromHours(jobRuns.Select(x => x.EndDate - x.StartDate).Sum(x => x.TotalHours)).ToString(@"hh\:mm\:ss");

                    int meters = (int)jobRuns.Select(x => x.EndPosition).Sum();
                    TotalMachineMeters = $"{meters.ToString("N0")} meters";
                }
            }
            catch (Exception ex)
            {
                LogManager.Log(ex, "Error loading machine counters.");
                TotalMachineMeters = "error!";
                TotalMachineWorkTime = "error!";
            }
        }
    }
}
n class="w"> is JobTicket job)) return; if (_parentScrollViewer == null) { _parentScrollViewer = this.FindAncestor<ScrollViewer>(); _parentScrollViewer.ScrollChanged += ScrollViewer_ScrollChanged; } else if (_viewportHeight == 0) { _viewportHeight = _parentScrollViewer.ActualHeight; } _sizeControl = new Size(); _sizeControl.Height += 10; DrawHeaderText(drawingContext, "JOB OUTLINE", 30, LevelOffset.level_0); _sizeControl.Height += HEADER_FONT_HEIGHT; _sizeControl.Height += 20; DrawHeaderText(drawingContext, "BASIC", 17, LevelOffset.level_0); _sizeControl.Height += TITLE_FONT_HEIGHT; _sizeControl.Height += 5.0; var basicProps = GetNameValueList(job); foreach (var prop in basicProps) { DrawNameValueText(drawingContext, prop, LevelOffset.level_1, PackIconKind.Pencil); _sizeControl.Height += NORMAL_FONT_HEIGHT; } //JobTicket.Spool if (job.Spool != null) { _sizeControl.Height += 20; DrawHeaderText(drawingContext, "SPOOL", 17, LevelOffset.level_0); _sizeControl.Height += TITLE_FONT_HEIGHT; _sizeControl.Height += 5.0; basicProps = GetNameValueList(job.Spool); foreach (var prop in basicProps) { DrawNameValueText(drawingContext, prop, LevelOffset.level_1, PackIconKind.Pencil); _sizeControl.Height += NORMAL_FONT_HEIGHT; } } //JobTicket.ProcessParameters if (job.ProcessParameters != null) { _sizeControl.Height += 20; DrawHeaderText(drawingContext, "PROCESS PARAMETERS", 17, LevelOffset.level_0); _sizeControl.Height += TITLE_FONT_HEIGHT; _sizeControl.Height += 5.0; basicProps = GetNameValueList(job.ProcessParameters); foreach (var prop in basicProps) { DrawNameValueText(drawingContext, prop, LevelOffset.level_1, PackIconKind.Settings); _sizeControl.Height += NORMAL_FONT_HEIGHT; } } //JobTicket.Segments if (job.Segments != null) { _sizeControl.Height += 20; DrawHeaderText(drawingContext, "SEGMENTS", 17, LevelOffset.level_0); _sizeControl.Height += TITLE_FONT_HEIGHT; _sizeControl.Height += 10.0; int index = 0; foreach (JobSegment seg in job.Segments) { DrawHeaderText(drawingContext, string.Format("#{0} SEGMENT", ++index), 14, LevelOffset.level_1); _sizeControl.Height += SUB_TITLE_FONT_HEIGHT; basicProps = GetNameValueList(seg); foreach (var prop in basicProps) { DrawNameValueText(drawingContext, prop, LevelOffset.level_2, PackIconKind.Pencil); _sizeControl.Height += NORMAL_FONT_HEIGHT; } //BrushStops DrawHeaderText(drawingContext, "BRUSH STOPS", 12, LevelOffset.level_3); _sizeControl.Height += NORMAL_FONT_HEIGHT; int indexBrush = 0; foreach (JobBrushStop brushstop in seg.BrushStops) { _sizeControl.Height += 5.0; DrawHeaderText(drawingContext, string.Format("#{0} STOP", ++indexBrush), 11, LevelOffset.level_4); _sizeControl.Height += NORMAL_FONT_HEIGHT; var brushStops = GetNameValueList(brushstop); foreach (var brushstopprop in brushStops) { DrawNameValueText(drawingContext, brushstopprop, LevelOffset.level_5, PackIconKind.Pencil); _sizeControl.Height += NORMAL_FONT_HEIGHT; } DrawHeaderText(drawingContext, "DISPENSERS", 12, LevelOffset.level_6); _sizeControl.Height += NORMAL_FONT_HEIGHT; _sizeControl.Height += 5.0; int indexDispenser = 0; foreach (JobDispenser disp in brushstop.Dispensers) { DrawHeaderText(drawingContext, string.Format("#{0} DISPENSER", ++indexDispenser), 11, LevelOffset.level_6); _sizeControl.Height += NORMAL_FONT_HEIGHT; var dispProperties = GetNameValueList(disp); foreach (var dispprop in dispProperties) { DrawNameValueText(drawingContext, dispprop, LevelOffset.level_7, PackIconKind.ArrowRightBoldCircle); _sizeControl.Height += NORMAL_FONT_HEIGHT; } } } } } if (Height != _sizeControl.Height) { Height = _sizeControl.Height; } } public IEnumerable<Tuple<String, String>> GetNameValueList(object value) { if (value != null) { var properties = value.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => (!x.PropertyType.IsClass && !typeof(IEnumerable).IsAssignableFrom(x.PropertyType)) || x.PropertyType == typeof(String)).ToList(); return properties.Select(x => new Tuple<string, string>(x.Name, x.GetValue(value).ToString())); } else { return null; } } #endregion render #region drawing protected void DrawNameValueText(DrawingContext drawingContext, Tuple<string, string> text, double levelOfOffset, PackIconKind? icon) { if (IsInViewPort()) { FormattedText formattedName = new FormattedText(text.Item1 + ": ", System.Globalization.CultureInfo.InvariantCulture, System.Windows.FlowDirection.LeftToRight, new Typeface(this.FontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal), 12, Foreground); DrawIconTextIfVisible(drawingContext, levelOfOffset, formattedName, icon); double widthOfNameText = formattedName.WidthIncludingTrailingWhitespace + 17 + levelOfOffset;//17 pix for draw icon before text FormattedText formattedValue = new FormattedText(text.Item2, System.Globalization.CultureInfo.InvariantCulture, System.Windows.FlowDirection.LeftToRight, new Typeface(this.FontFamily, FontStyles.Normal, FontWeights.SemiBold, FontStretches.Normal), 12, Foreground); DrawIconTextIfVisible(drawingContext, widthOfNameText, formattedValue); _sizeControl.Width = Math.Max(_sizeControl.Width, (widthOfNameText + formattedValue.WidthIncludingTrailingWhitespace)); } } private bool IsInViewPort() { return (_sizeControl.Height >= _verticalOffset && _sizeControl.Height <= (_verticalOffset + _viewportHeight + 5)); } protected void DrawHeaderText(DrawingContext drawingContext, string text, int fontSize, double levelOfOffset) { if (IsInViewPort()) { FormattedText formattedtext = new FormattedText(text, System.Globalization.CultureInfo.InvariantCulture, System.Windows.FlowDirection.LeftToRight, new Typeface(this.FontFamily, FontStyles.Normal, FontWeights.SemiBold, FontStretches.Normal), fontSize, Foreground); DrawIconTextIfVisible(drawingContext, levelOfOffset, formattedtext); _sizeControl.Width = Math.Max(_sizeControl.Width, (formattedtext.Width + levelOfOffset)); } } private void DrawIconTextIfVisible(DrawingContext drawingContext, double levelOfOffset, FormattedText formattedText, PackIconKind? icon = null) { if (icon is PackIconKind) { DrawIcon(drawingContext, (PackIconKind)icon, new Point(levelOfOffset, _sizeControl.Height)); levelOfOffset += 17; } drawingContext.DrawText(formattedText, new Point(levelOfOffset, _sizeControl.Height)); } private void DrawIcon(DrawingContext drawingContext, PackIconKind kind, Point point) { GeometryGroup group = GetGeometryByIcon(kind); SetGeometryPosition(group, point); drawingContext.DrawGeometry(Foreground, new Pen(Brushes.White, 1), group); } private GeometryGroup GetGeometryByIcon(PackIconKind kind) { PackIcon icon = new PackIcon { Kind = kind }; Geometry geometry = Geometry.Parse(icon.Data); GeometryGroup group = new GeometryGroup(); group.Children.Add(geometry); TransformGroup tg = new TransformGroup(); tg.Children.Add(new ScaleTransform() { ScaleX = 10d / geometry.Bounds.Width, ScaleY = 10d / geometry.Bounds.Height, }); tg.Children.Add(new TranslateTransform() { }); group.Transform = tg; return group; } private void SetGeometryPosition(GeometryGroup group, Point point) { TransformGroup tg = group.Transform as TransformGroup; (tg.Children[1] as TranslateTransform).X = point.X; (tg.Children[1] as TranslateTransform).Y = point.Y + 1; } #endregion drawing } }