diff options
| author | Roy <roy.mail.net@gmail.com> | 2018-02-11 02:24:33 +0200 |
|---|---|---|
| committer | Roy <roy.mail.net@gmail.com> | 2018-02-11 02:24:33 +0200 |
| commit | 6c6dfe112268888b6859da5880d866943d1a4455 (patch) | |
| tree | daf4e006d3fefb3d9a6825de3d4ef5575e94714f /Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs | |
| parent | dbfde8706313c147a28b16bcc7e7fef158d930bb (diff) | |
| download | Tango-6c6dfe112268888b6859da5880d866943d1a4455.tar.gz Tango-6c6dfe112268888b6859da5880d866943d1a4455.zip | |
Implemented Save/Load tech project.
Added menu items...
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs')
| -rw-r--r-- | Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs | 324 |
1 files changed, 263 insertions, 61 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs index 21d2c50c2..ca318f029 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs @@ -1,4 +1,5 @@ using Google.Protobuf.Collections; +using Microsoft.Win32; using RealTimeGraphEx.Controllers; using System; using System.Collections.Generic; @@ -16,6 +17,7 @@ using Tango.Integration.Observables; using Tango.Integration.Operators; using Tango.MachineStudio.Common.StudioApplication; using Tango.MachineStudio.Technician.Editors; +using Tango.MachineStudio.Technician.Project; using Tango.MachineStudio.Technician.TechItems; using Tango.PMR.Diagnostics; using Tango.SharedUI; @@ -29,7 +31,12 @@ namespace Tango.MachineStudio.Technician.ViewModels private Dictionary<MultiGraphItem, GraphMultiController> _multiControllers; private static object _elementsLock = new object(); + #region Properties + private ObservableCollection<IElementEditor> _elements; + /// <summary> + /// Gets or sets the visual elements. + /// </summary> public ObservableCollection<IElementEditor> Elements { get { return _elements; } @@ -37,6 +44,9 @@ namespace Tango.MachineStudio.Technician.ViewModels } private ObservableCollection<TechItem> _availableTechItems; + /// <summary> + /// Gets or sets the available tech items. + /// </summary> public ObservableCollection<TechItem> AvailableTechItems { get { return _availableTechItems; } @@ -44,25 +54,49 @@ namespace Tango.MachineStudio.Technician.ViewModels } private TechItem _selectedTechItem; - + /// <summary> + /// Gets or sets the selected available tech item. + /// </summary> public TechItem SelectedTechItem { get { return _selectedTechItem; } set { _selectedTechItem = value; RaisePropertyChangedAuto(); } } + /// <summary> + /// Gets or sets the db adapter. + /// </summary> public ObservablesEntitiesAdapter Adapter { get; set; } + /// <summary> + /// Gets or sets the application manager. + /// </summary> public IStudioApplicationManager ApplicationManager { get; set; } private IMachineOperator _machineOperator; - + /// <summary> + /// Gets or sets the machine operator. + /// </summary> public IMachineOperator MachineOperator { get { return _machineOperator; } set { _machineOperator = value; RaisePropertyChangedAuto(); } } + #endregion + + #region Commands + + public RelayCommand SaveAsProjectCommand { get; set; } + + public RelayCommand SaveProjectCommand { get; set; } + + public RelayCommand OpenProjectCommand { get; set; } + + #endregion + + #region Constructors + public MachineTechViewVM(IStudioApplicationManager applicationManager) { _singleControllers = new Dictionary<SingleGraphItem, GraphController>(); @@ -74,10 +108,21 @@ namespace Tango.MachineStudio.Technician.ViewModels ApplicationManager.ConnectedMachineChanged += ApplicationManager_ConnectedMachineChanged; Adapter = ObservablesEntitiesAdapter.Instance; - //Adapter.Initialize(); //TODO: Remove on Machine Studio. Elements = new ObservableCollection<IElementEditor>(); + + OpenProjectCommand = new RelayCommand(OpenProject); + SaveAsProjectCommand = new RelayCommand(SaveAsProject); } + #endregion + + #region Event Handlers + + /// <summary> + /// Applications the manager connected machine changed. + /// </summary> + /// <param name="sender">The sender.</param> + /// <param name="machine">The machine.</param> private void ApplicationManager_ConnectedMachineChanged(object sender, Integration.Services.IExternalBridgeClient machine) { MachineOperator = machine; @@ -89,11 +134,20 @@ namespace Tango.MachineStudio.Technician.ViewModels } } + /// <summary> + /// Machines the operator diagnostics data available. + /// </summary> + /// <param name="sender">The sender.</param> + /// <param name="response">The response.</param> private void MachineOperator_DiagnosticsDataAvailable(object sender, PushDiagnosticsResponse response) { PopulateDiagnosticsData(response); } + #endregion + + #region Populate Diagnostics Data + private void PopulateDiagnosticsData(PushDiagnosticsResponse data) { lock (_elementsLock) @@ -175,6 +229,10 @@ namespace Tango.MachineStudio.Technician.ViewModels } } + #endregion + + #region Private Methods + private double GetLastMonitorValue(TechMonitor monitor, object value) { if (!monitor.MultiChannel) @@ -200,81 +258,107 @@ namespace Tango.MachineStudio.Technician.ViewModels return arrayOfDoubles.Select(x => x.Data.ToList()).ToList(); } - public void AddElement(Rect bounds) + #endregion + + #region Add/Remove Element + + public void CreateElement(Rect bounds) + { + CreateElement(SelectedTechItem, bounds); + } + + private void CreateElement(TechItem item, Rect bounds) { - if (SelectedTechItem is MonitorItem) + if (item is MonitorItem) { - var monitorItem = new MonitorItem(Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault()); - MonitorElementEditor editor = new MonitorElementEditor(monitorItem, bounds); - Elements.Add(editor); + CreateElement<MonitorElementEditor, MonitorItem, TechMonitor>(bounds, Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault()); } - else if (SelectedTechItem is MeterItem) + else if (item is MeterItem) { - var meterItem = new MeterItem(Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault()); - MeterElementEditor editor = new MeterElementEditor(meterItem, bounds); - Elements.Add(editor); + CreateElement<MeterElementEditor, MeterItem, TechMonitor>(bounds, Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault()); } - else if (SelectedTechItem is SingleGraphItem) + else if (item is SingleGraphItem) { - var graphItem = new SingleGraphItem(Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault()); - SingleGraphElementEditor editor = new SingleGraphElementEditor(graphItem, bounds); - editor.InnerGraph.InnerGraph.MaxPoints = Common.Helpers.GraphsHelper.GetMaxPoints(graphItem.TechMonitor.PointsPerFrame); - graphItem.Editor = editor; - - - GraphController controller = new GraphController(); - editor.InnerGraph.Controller = controller; - - _singleControllers.Add(graphItem, controller); - - Elements.Add(editor); + var editor = CreateElement<SingleGraphElementEditor, SingleGraphItem, TechMonitor>(bounds, Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault()); + InitSingleGraphitem(editor.GraphItem, editor); } - else if (SelectedTechItem is MultiGraphItem) + else if (item is MultiGraphItem) { - var graphItem = new MultiGraphItem(Adapter.TechMonitors.Where(x => x.MultiChannel).FirstOrDefault()); - MultiGraphElementEditor editor = new MultiGraphElementEditor(graphItem, bounds); - editor.InnerGraph.InnerGraph.MaxPoints = Common.Helpers.GraphsHelper.GetMaxPoints(graphItem.TechMonitor.PointsPerFrame); - graphItem.Editor = editor; - - - GraphMultiController controller = new GraphMultiController(); - - for (int i = 0; i < graphItem.TechMonitor.ChannelCount; i++) - { - controller.AddSeries(new RealTimeGraphEx.DataSeries.DataYSeries() - { - UseFillAndStroke = true, - Name = graphItem.TechMonitor.Name.First() + (i + 1).ToString(), - Stroke = new SolidColorBrush(ColorHelper.GetRandomColor()), - }); - } + var editor = CreateElement<MultiGraphElementEditor, MultiGraphItem, TechMonitor>(bounds, Adapter.TechMonitors.Where(x => x.MultiChannel).FirstOrDefault()); + InitMultiGraphItem(editor.GraphItem, editor); + } + else if (item is MotorItem) + { + var editor = CreateElement<MotorElementEditor, MotorItem, TechMotor>(bounds, Adapter.TechMotors.FirstOrDefault()); + InitMotorItem(editor.MotorItem); + } + else if (item is DispenserItem) + { + var editor = CreateElement<DispenserElementEditor, DispenserItem, TechDispenser>(bounds, Adapter.TechDispensers.FirstOrDefault()); + InitDispenserItem(editor.DispenserItem); + } + else if (item is IOItem) + { + var editor = CreateElement<IOElementEditor, IOItem, int>(bounds, 0); + InitIOItem(editor.IOItem); + } + } - editor.InnerGraph.Controller = controller; + private Editor CreateElement<Editor, Tech, Value>(Rect bounds, Value value) where Editor : IElementEditor where Tech : TechItem + { + TechItem item = Activator.CreateInstance(typeof(Tech), new object[] { value }) as TechItem; + IElementEditor editor = Activator.CreateInstance(typeof(Editor), new object[] { ((Tech)item), bounds }) as IElementEditor; + Elements.Add(editor); + return (Editor)editor; + } - _multiControllers.Add(graphItem, controller); + private Editor CreateElement<Editor>(TechItem item) where Editor : IElementEditor + { + IElementEditor editor = Activator.CreateInstance(typeof(Editor), new object[] { item, item.GetBounds() }) as IElementEditor; + Elements.Add(editor); + return (Editor)editor; + } - Elements.Add(editor); + private void AddTechItem(TechItem item) + { + if (item is MonitorItem) + { + (item as MonitorItem).TechMonitor = Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault(x => x.Guid == item.ItemGuid); + CreateElement<MonitorElementEditor>(item); + } + else if (item is MeterItem) + { + (item as MeterItem).TechMonitor = Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault(x => x.Guid == item.ItemGuid); + CreateElement<MeterElementEditor>(item); } - else if (SelectedTechItem is MotorItem) + else if (item is SingleGraphItem) { - var motorItem = new MotorItem(Adapter.TechMotors.FirstOrDefault()); - MotorElementEditor editor = new MotorElementEditor(motorItem, bounds); - Elements.Add(editor); - InitMotorItem(motorItem); + (item as SingleGraphItem).TechMonitor = Adapter.TechMonitors.Where(x => !x.MultiChannel).FirstOrDefault(x => x.Guid == item.ItemGuid); + var editor = CreateElement<SingleGraphElementEditor>(item); + InitSingleGraphitem(editor.GraphItem, editor); } - else if (SelectedTechItem is DispenserItem) + else if (item is MultiGraphItem) { - var dispenserItem = new DispenserItem(Adapter.TechDispensers.FirstOrDefault()); - DispenserElementEditor editor = new DispenserElementEditor(dispenserItem, bounds); - Elements.Add(editor); - InitDispenserItem(dispenserItem); + (item as MultiGraphItem).TechMonitor = Adapter.TechMonitors.Where(x => x.MultiChannel).FirstOrDefault(x => x.Guid == item.ItemGuid); + var editor = CreateElement<MultiGraphElementEditor>(item); + InitMultiGraphItem(editor.GraphItem, editor); } - else if (SelectedTechItem is IOItem) + else if (item is MotorItem) { - var ioItem = new IOItem(0); - IOElementEditor editor = new IOElementEditor(ioItem, bounds); - Elements.Add(editor); - InitIOItem(ioItem); + (item as MotorItem).TechMotor = Adapter.TechMotors.FirstOrDefault(x => x.Guid == item.ItemGuid); + var editor = CreateElement<MotorElementEditor>(item); + InitMotorItem(editor.MotorItem); + } + else if (item is DispenserItem) + { + (item as DispenserItem).TechDispenser = Adapter.TechDispensers.FirstOrDefault(x => x.Guid == item.ItemGuid); + var editor = CreateElement<DispenserElementEditor>(item); + InitDispenserItem(editor.DispenserItem); + } + else if (item is IOItem) + { + var editor = CreateElement<IOElementEditor>(item); + InitIOItem(editor.IOItem); } } @@ -335,9 +419,28 @@ namespace Tango.MachineStudio.Technician.ViewModels _multiControllers.Add(graphItem, controller); } + else if (element is MotorElementEditor) + { + var motorItem = element.HostedElement as MotorItem; + InitMotorItem(motorItem); + } + else if (element is DispenserElementEditor) + { + var dispenser = element.HostedElement as DispenserItem; + InitDispenserItem(dispenser); + } + else if (element is IOElementEditor) + { + var ioItem = element.HostedElement as IOItem; + InitIOItem(ioItem); + } } } + #endregion + + #region Init Tech Items + private void InitMotorItem(MotorItem item) { item.ActionExecuted += async (x, action) => @@ -492,5 +595,104 @@ namespace Tango.MachineStudio.Technician.ViewModels } }; } + + private void InitSingleGraphitem(SingleGraphItem item, SingleGraphElementEditor editor) + { + editor.InnerGraph.InnerGraph.MaxPoints = Common.Helpers.GraphsHelper.GetMaxPoints(item.TechMonitor.PointsPerFrame); + item.Editor = editor; + + GraphController controller = new GraphController(); + editor.InnerGraph.Controller = controller; + + _singleControllers.Add(item, controller); + } + + private void InitMultiGraphItem(MultiGraphItem item, MultiGraphElementEditor editor) + { + editor.InnerGraph.InnerGraph.MaxPoints = Common.Helpers.GraphsHelper.GetMaxPoints(item.TechMonitor.PointsPerFrame); + item.Editor = editor; + + GraphMultiController controller = new GraphMultiController(); + + for (int i = 0; i < item.TechMonitor.ChannelCount; i++) + { + controller.AddSeries(new RealTimeGraphEx.DataSeries.DataYSeries() + { + UseFillAndStroke = true, + Name = item.TechMonitor.Name.First() + (i + 1).ToString(), + Stroke = new SolidColorBrush(ColorHelper.GetRandomColor()), + }); + } + + editor.InnerGraph.Controller = controller; + + _multiControllers.Add(item, controller); + } + + #endregion + + #region Public Methods + + public void OpenProject() + { + OpenFileDialog dlg = new OpenFileDialog(); + dlg.Title = "Select Technician Project File"; + dlg.Filter = "Technician Project File|*.tpf"; + + if (dlg.ShowDialog().Value) + { + OpenProjectFile(dlg.FileName); + } + } + + public void OpenProjectFile(String fileName) + { + LoadProject(MachineTechViewProject.Load(fileName)); + } + + public void LoadProject(MachineTechViewProject project) + { + Elements.Clear(); + _singleControllers.Clear(); + _multiControllers.Clear(); + + foreach (var item in project.Items) + { + AddTechItem(item); + } + } + + private void SaveAsProject() + { + SaveFileDialog dlg = new SaveFileDialog(); + dlg.Title = "Select Technician Project Location"; + dlg.Filter = "Technician Project File|*.tpf"; + + if (dlg.ShowDialog().Value) + { + SaveProject(dlg.FileName); + } + } + + private void SaveProject(String fileName) + { + MachineTechViewProject project = CreateProjectFile(); + project.Save(fileName); + } + + private MachineTechViewProject CreateProjectFile() + { + MachineTechViewProject project = new MachineTechViewProject(); + + foreach (var element in Elements) + { + (element.HostedElement as TechItem).SetBounds(element.GetBounds()); + project.Items.Add(element.HostedElement as TechItem); + } + + return project; + } + + #endregion } } |
