aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs
diff options
context:
space:
mode:
authorRoy <roy.mail.net@gmail.com>2018-02-11 02:24:33 +0200
committerRoy <roy.mail.net@gmail.com>2018-02-11 02:24:33 +0200
commit6c6dfe112268888b6859da5880d866943d1a4455 (patch)
treedaf4e006d3fefb3d9a6825de3d4ef5575e94714f /Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Technician/ViewModels/MachineTechViewVM.cs
parentdbfde8706313c147a28b16bcc7e7fef158d930bb (diff)
downloadTango-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.cs324
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
}
}