aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Web/Tango.MachineService/Scripts/jquery-3.3.1.min.js
blob: 4d9b3a258759c53e7bc66b6fc554c51e2434437c (plain)
1
2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.BL.Entities;
using Tango.BL.Enumerations;
using Tango.Core.Commands;
using Tango.Integration.Operation;
using Tango.Logging;
using Tango.PMR.Printing;
using Tango.PPC.Common;
using Tango.PPC.Common.Navigation;
using Tango.PPC.Common.Notifications;
using Tango.PPC.Jobs.AppBarItems;
using Tango.PPC.Jobs.AppButtons;
using Tango.PPC.Jobs.Dialogs;
using Tango.PPC.Jobs.NavigationObjects;
using Tango.PPC.Jobs.Views;

namespace Tango.PPC.Jobs.ViewModels
{
    /// <summary>
    /// Represents the job progress view model.
    /// </summary>
    /// <seealso cref="Tango.PPC.Common.PPCViewModel" />
    public class JobProgressViewVM : PPCViewModel
    {
        private StopPrintingButton _stop_job_btn;
        private JobHandler _handler;

        #region Properties

        private Job _job;
        /// <summary>
        /// Gets or sets the job.
        /// </summary>
        public Job Job
        {
            get { return _job; }
            set { _job = value;
                if(_job == null)
                {
                    IsDyeingProcess = false;
                }
                RaisePropertyChangedAuto(); }
        }

        private RunningJobStatus _runningJobStatus;
        /// <summary>
        /// Gets or sets the running job status.
        /// </summary>
        public RunningJobStatus RunningJobStatus
        {
            get { return _runningJobStatus; }
            set {
                _runningJobStatus = value;
                if(_runningJobStatus == null)
                {
                    IsDyeingProcess = false;
                }
                RaisePropertyChangedAuto();
            }
        }

        private bool _isDisplayJobOutline;
        /// <summary>
        /// Gets or sets a value indicating whether to display the job outline.
        /// </summary>
        public bool IsDisplayJobOutline
        {
            get { return _isDisplayJobOutline; }
            set { _isDisplayJobOutline = value; RaisePropertyChangedAuto(); }
        }

        private JobTicket _jobOutlineTicket;
        /// <summary>
        /// Gets or sets the job outline ticket.
        /// </summary>
        public JobTicket JobOutlineTicket
        {
            get { return _jobOutlineTicket; }
            set { _jobOutlineTicket = value; RaisePropertyChangedAuto(); }
        }

        private bool _isDyeingProcess;

        public bool IsDyeingProcess
        {
            get { return _isDyeingProcess; }
            set
            {
                if (_isDyeingProcess != value)
                {
                    _isDyeingProcess = value;
                    RaisePropertyChangedAuto();
                }
            }
        }

        private BrushStop _currentBrushStop;
        public BrushStop CurrentBrushStop
        {
            get { return _currentBrushStop; }
            set
            {
                if (_currentBrushStop != value)
                {
                    _currentBrushStop = value;
                    OnUpdateCurrentBrush();
                }
            }
        }

        public JobBrushStop JobBrushStop { get; set; }

        public double CyanOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.Cyan); }
        }

        public double MagentaOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.Magenta); }
        }

        public double YellowOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.Yellow); }
        }

        public double BlackOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.Black); }
        }

        public double LightCyanOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.LightCyan); }
        }

        public double LightMagentaOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.LightMagenta); }
        }

        public double LightYellowOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.LightYellow); }
        }

        #endregion

        #region Commands

        /// <summary>
        /// Gets or sets the go to job command.
        /// </summary>
        /// <value>
        /// The go to job command.
        /// </value>
        public RelayCommand GoToJobCommand { get; set; }

        /// <summary>
        /// Gets or sets the display job outline command.
        /// </summary>
        public RelayCommand DisplayJobOutlineCommand { get; set; }

        /// <summary>
        /// Gets or sets the hide job outline command.
        /// </summary>
        public RelayCommand HideJobOutlineCommand { get; set; }

        #endregion

        public JobProgressViewVM()
        {
            _stop_job_btn = new StopPrintingButton();
            _stop_job_btn.Pressed += _stop_job_btn_Pressed;

            GoToJobCommand = new RelayCommand(GoToJob);
            DisplayJobOutlineCommand = new RelayCommand(DisplayJobOutline);
            HideJobOutlineCommand = new RelayCommand(HideJobOutline);
        }

        #region Private Methods

        private void HideJobOutline()
        {
            IsDisplayJobOutline = false;
        }

        private void DisplayJobOutline()
        {
            JobOutlineTicket = _handler.JobTicket;
            IsDisplayJobOutline = true;
        }

        private void GoToJob()
        {
            NavigationManager.NavigateWithObject<JobsV2Module, JobView, JobNavigationObject>(new JobNavigationObject() { Job = _handler.Job });
            NavigationManager.ClearHistoryExcept<JobsView>();
        }

        protected void OnUpdateCurrentBrush()
        {
            CurrentBrushStop.SetLiquidVolumes(MachineProvider.Machine.Configuration, Job.Rml, MachineProvider.MachineOperator.CurrentProcessParameters);

            RaisePropertyChanged(nameof(CurrentBrushStop));

            RaisePropertyChanged(nameof(CyanOutput));
            RaisePropertyChanged(nameof(LightCyanOutput));
            RaisePropertyChanged(nameof(MagentaOutput));
            RaisePropertyChanged(nameof(LightMagentaOutput));
            RaisePropertyChanged(nameof(YellowOutput));
            RaisePropertyChanged(nameof(LightYellowOutput));
            RaisePropertyChanged(nameof(BlackOutput));
        }

        private double GetVolumeLiquidType(LiquidTypes liquidType)
        {
            if (JobBrushStop != null && JobBrushStop.Dispensers != null && JobBrushStop.Dispensers.Count > 0)
            {
                var lt = JobBrushStop.Dispensers.FirstOrDefault(x => x.DispenserLiquidType == (DispenserLiquidType)liquidType);

                if (lt != null)
                {
                    return Math.Round(lt.Volume, 2);
                }
            }
            return 0;
        }

        #endregion

        #region Override Methods

        /// <summary>
        /// Called when the application has been started.
        /// </summary>
        public override void OnApplicationStarted()
        {
            MachineProvider.MachineOperator.PrintingStarted += MachineOperator_PrintingStarted;
            MachineProvider.MachineOperator.PrintingEnded += MachineOperator_PrintingEnded;
        }

        /// <summary>
        /// Called when the navigation system has navigated to this VM view.
        /// </summary>
        public override void OnNavigatedTo()
        {
            base.OnNavigatedTo();

            IsDisplayJobOutline = false;

            if (_handler != null && !_handler.Status.IsFailed)
            {
                _stop_job_btn.Push();
            }
        }

        #endregion

        #region Event Handlers

        private void _stop_job_btn_Pressed()
        {
            if (_handler != null)
            {
                _handler.Cancel();
                IsDyeingProcess = false;
            }
        }

        /// <summary>
        /// Handles the PrintingStarted event of the MachineOperator.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="PrintingEventArgs"/> instance containing the event data.</param>
        private void MachineOperator_PrintingStarted(object sender, PrintingEventArgs e)
        {
            _handler = e.JobHandler;
            Job = e.Job;
            e.JobHandler.StatusChanged += JobHandler_StatusChanged;
            e.JobHandler.SpoolChangeRequired += JobHandler_SpoolChangeRequired;
            e.JobHandler.Stopped += JobHandler_Stopped;
            e.JobHandler.CanCancelChanged += JobHandler_CanCancelChanged;

            _stop_job_btn.Push();
            _stop_job_btn.IsEnabled = true;
        }

        private void MachineOperator_PrintingEnded(object sender, PrintingEventArgs e)
        {
            LogManager.Log("Printing ended, popping job stop button...");

            if (_stop_job_btn != null)
            {
                _stop_job_btn.Pop();
            }
            else
            {
                LogManager.Log("Job stop button instance was null!", LogCategory.Warning);
            }
        }

        /// <summary>
        /// Handles the SpoolChangeRequired event of the JobHandler.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="SpoolChangeRequiredEventArgs"/> instance containing the event data.</param>
        private void JobHandler_SpoolChangeRequired(object sender, SpoolChangeRequiredEventArgs e)
        {
            InvokeUI(async () =>
            {
                if ((await NotificationProvider.ShowDialog(new SpoolChangeViewVM(e))).DialogResult)
                {
                    e.Confirm();
                }
                else
                {
                    e.Abort();
                }
            });
        }

        /// <summary>
        /// Handles the Stopped event of the JobHandler.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        private void JobHandler_Stopped(object sender, EventArgs e)
        {
            if (_handler != null)
            {
                _handler.StatusChanged -= JobHandler_StatusChanged;
                _handler.SpoolChangeRequired -= JobHandler_SpoolChangeRequired;
                _handler.Stopped -= JobHandler_Stopped;
                _handler.CanCancelChanged -= JobHandler_CanCancelChanged;
                IsDyeingProcess = false;
            }
        }

        /// <summary>
        /// Handles the JobHandler StatusChanged event.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The e.</param>
        private void JobHandler_StatusChanged(object sender, RunningJobStatus e)
        {
            InvokeUI(() =>
            {
                RunningJobStatus = e;
                IsDyeingProcess = (RunningJobStatus != null && RunningJobStatus.CurrentSegment != null);
            if (RunningJobStatus != null && RunningJobStatus.CurrentSegment != null)
            {
                if (_runningJobStatus.CurrentSegment.IsInterSegment)
                {
                    CurrentBrushStop = _runningJobStatus.CurrentSegment.BrushStops.FirstOrDefault();
                    JobBrushStop = null;
                }
                else
                {
                    var realsegmIndex = 1;
                    if (Job.EnableInterSegment && Job.InterSegmentLength > 0)
                    {
                        int segmentIndex = _runningJobStatus.CurrentSegment.SegmentIndex - (Job.EffectiveSegments.Count * RunningJobStatus.CurrentUnit);
                        if (RunningJobStatus.CurrentUnit > 0)
                        {
                            segmentIndex -= RunningJobStatus.CurrentUnit;// inter segment between units
                        }
                        realsegmIndex = (int)(segmentIndex / 2) + 1;
                    }
                    else
                    {
                        realsegmIndex = Math.Max(_runningJobStatus.CurrentSegment.SegmentIndex - (Job.Segments.Count * RunningJobStatus.CurrentUnit), 0);
                    }

                    var segment = Job.Segments.FirstOrDefault(x => x.SegmentIndex == realsegmIndex);
                    if (segment != null)
                    {
                        if (_handler.JobTicket.Segments.Count > 0)
                        {
                            JobBrushStop = _handler.JobTicket.Segments[Job.OrderedSegments.IndexOf(segment)].BrushStops.First();
                        }
                    }
                    CurrentBrushStop = RunningJobStatus.CurrentSegment.FirstBrushStop;
                }
                }
            });
        }

        /// <summary>
        /// Handles the CanCancelChanged event of the JobHandler control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        private void JobHandler_CanCancelChanged(object sender, EventArgs e)
        {
            _stop_job_btn.IsEnabled = _handler.CanCancel;
        }

        #endregion
    }
}