Files
aistudio-wpf-diagram/Extensions/AIStudio.Wpf.SFC/ViewModels/SFCNode.cs

226 lines
7.8 KiB
C#
Raw Normal View History

using System;
2021-07-30 18:26:35 +08:00
using System.Collections.Generic;
using System.ComponentModel;
2021-08-03 18:19:47 +08:00
using System.Linq;
using System.Windows.Media;
2022-10-28 22:45:39 +08:00
using AIStudio.Wpf.DiagramDesigner;
2023-01-25 11:11:27 +08:00
using AIStudio.Wpf.DiagramDesigner.Models;
2022-12-12 22:33:17 +08:00
using AIStudio.Wpf.DiagramDesigner.Services;
using AIStudio.Wpf.SFC.Models;
2021-07-30 18:26:35 +08:00
namespace AIStudio.Wpf.SFC.ViewModels
{
public class SFCNode : DesignerItemViewModelBase
{
protected IUIVisualizerService visualiserService;
2023-01-27 14:54:03 +08:00
public SFCNode(SFCNodeKinds kind) : this(null, kind)
{
}
public SFCNode(IDiagramViewModel root, SFCNodeKinds kind) : base(root)
2021-07-30 18:26:35 +08:00
{
ColorViewModel.FillColor.Color = Colors.Blue;
2021-07-30 18:26:35 +08:00
Kind = kind;
ItemWidth = 80;
2021-08-03 18:19:47 +08:00
ItemHeight = 40;
2021-07-30 18:26:35 +08:00
}
2023-01-24 17:53:04 +08:00
public SFCNode(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer)
2021-07-30 18:26:35 +08:00
{
}
2023-01-25 11:11:27 +08:00
public SFCNode(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType)
{
}
2023-01-24 23:10:57 +08:00
public override SelectableItemBase GetSerializableObject()
{
return new SFCNodeDesignerItem(this);
}
2023-03-25 11:59:31 +08:00
protected override void Init(IDiagramViewModel root, bool initNew)
{
IsInnerConnector = true;
2021-07-30 18:26:35 +08:00
ShowRotate = false;
ShowArrow = false;
2021-07-30 18:26:35 +08:00
ShowText = true;
IsReadOnlyText = true;
2023-03-25 11:59:31 +08:00
base.Init(root, initNew);
2021-07-30 18:26:35 +08:00
visualiserService = ApplicationServicesProvider.Instance.Provider.VisualizerService;
2021-08-03 18:19:47 +08:00
}
2021-07-30 18:26:35 +08:00
2023-03-25 11:59:31 +08:00
protected override void InitNew()
{
ClearConnectors();
}
2023-01-27 14:54:03 +08:00
protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase)
2021-07-30 18:26:35 +08:00
{
2023-01-27 14:54:03 +08:00
base.LoadDesignerItemViewModel(designerbase);
2021-07-30 18:26:35 +08:00
2023-01-24 17:53:04 +08:00
if (designerbase is SFCNodeDesignerItem designer)
2021-08-03 18:19:47 +08:00
{
2023-01-24 17:53:04 +08:00
this.Kind = designer.Kind;
this.Expression = designer.Expression;
foreach (var connector in designer.Connectors)
2021-08-03 18:19:47 +08:00
{
2023-01-24 17:53:04 +08:00
FullyCreatedConnectorInfo fullyCreatedConnectorInfo = new FullyCreatedConnectorInfo(this.Root, this, connector);
if (fullyCreatedConnectorInfo.Orientation == ConnectorOrientation.Left)
{
Input.Add(Input.Count, fullyCreatedConnectorInfo);
}
else if (fullyCreatedConnectorInfo.Orientation == ConnectorOrientation.Right)
{
Output.Add(Output.Count, fullyCreatedConnectorInfo);
}
AddConnector(fullyCreatedConnectorInfo);
2021-08-03 18:19:47 +08:00
}
2023-01-24 17:53:04 +08:00
if (this is SFCActionNode actionNode)
2021-08-03 18:19:47 +08:00
{
2023-01-24 17:53:04 +08:00
actionNode.LinkPoint = designer.LinkPoints.FirstOrDefault();
}
else if (this is SFCConditionNode sFCConditionNode)
{
sFCConditionNode.LinkPoint = new System.Collections.ObjectModel.ObservableCollection<LinkPoint>(designer.LinkPoints);
}
else if (this is Simulate_SolenoidViewModel simulate_SolenoidViewModel)
{
simulate_SolenoidViewModel.DILinkPoint = designer.LinkPoints.FirstOrDefault();
simulate_SolenoidViewModel.DOLinkPoint = designer.LinkPoints.LastOrDefault();
}
else if (this is Simulate_StartViewModel simulate_StartViewModel)
{
simulate_StartViewModel.LinkPoint = designer.LinkPoints.FirstOrDefault();
}
else if (this is Simulate_TankViewModel simulate_TankViewModel)
{
simulate_TankViewModel.LinkPoint = designer.LinkPoints.FirstOrDefault();
2021-08-03 18:19:47 +08:00
}
}
2021-07-30 18:26:35 +08:00
}
public Dictionary<int, FullyCreatedConnectorInfo> Input { get; set; } = new Dictionary<int, FullyCreatedConnectorInfo>();
public Dictionary<int, FullyCreatedConnectorInfo> Output { get; set; } = new Dictionary<int, FullyCreatedConnectorInfo>();
public Dictionary<int, FullyCreatedConnectorInfo> Action { get; set; } = new Dictionary<int, FullyCreatedConnectorInfo>();
public virtual void ExecuteAddLeftInput(object parameter)
{
FullyCreatedConnectorInfo connector = new FullyCreatedConnectorInfo(this, ConnectorOrientation.Left, true);
connector.XRatio = 0;
Input.Add(Input.Count, connector);
for (int i = 0; i < Input.Values.Count; i++)
{
Input[i].YRatio = (i + 1.0) / (Input.Values.Count + 1.0);
}
AddConnector(connector);
}
public virtual void ExecuteAddTopInput(object parameter)
{
FullyCreatedConnectorInfo connector = new FullyCreatedConnectorInfo(this, ConnectorOrientation.Top, true);
connector.YRatio = 0;
Input.Add(Input.Count, connector);
for (int i = 0; i < Input.Values.Count; i++)
{
Input[i].XRatio = (i + 1.0) / (Input.Values.Count + 1.0);
if (Output.ContainsKey(i))
{
Output[i].XRatio = Input[i].XRatio;
}
}
AddConnector(connector);
}
public virtual void ExecuteAddRightOutput(object parameter)
{
FullyCreatedConnectorInfo connector = new FullyCreatedConnectorInfo(this, ConnectorOrientation.Right, true);
connector.XRatio = 1;
Output.Add(Output.Count, connector);
for (int i = 0; i < Output.Values.Count; i++)
{
Output[i].YRatio = (i + 1.0) / (Output.Values.Count + 1.0);
}
AddConnector(connector);
}
public virtual void ExecuteAddBottomOutput(object parameter)
{
FullyCreatedConnectorInfo connector = new FullyCreatedConnectorInfo(this, ConnectorOrientation.Bottom, true);
connector.YRatio = 1;
Output.Add(Output.Count, connector);
for (int i = 0; i < Output.Values.Count; i++)
{
Output[i].XRatio = (i + 1.0) / (Output.Values.Count + 1.0);
if (Input.ContainsKey(i))
{
Input[i].XRatio = Output[i].XRatio;
}
}
AddConnector(connector);
}
public virtual void ExecuteAddActionOutput(object parameter)
{
FullyCreatedConnectorInfo connector = new FullyCreatedConnectorInfo(this, ConnectorOrientation.Right, true);
connector.XRatio = 1;
Action.Add(Action.Count, connector);
Action[Action.Count - 1].YRatio = 0.5;
AddConnector(connector);
}
2021-07-30 18:26:35 +08:00
[Browsable(false)]
public SFCNodeKinds Kind { get; set; }
private double _value;
public double Value
{
get
{
return _value;
}
set
{
SetProperty(ref _value, value);
}
}
2021-08-02 18:08:43 +08:00
2021-08-03 18:19:47 +08:00
private string _expression;
public string Expression
{
get
{
return _expression;
}
set
{
SetProperty(ref _expression, value);
}
}
#region
2021-08-02 18:08:43 +08:00
private int _status;
public int Status
{
get { return _status; }
set
{
SetProperty(ref _status, value);
}
}
public List<SFCNode> NextNode { get; set; } = new List<SFCNode>();
public List<SFCNode> PreNode { get; set; } = new List<SFCNode>();
2021-08-03 18:19:47 +08:00
#endregion
2021-07-30 18:26:35 +08:00
}
}