使用设计模式优化一下逻辑图

This commit is contained in:
艾竹
2023-04-15 23:32:29 +08:00
parent c6bc57140f
commit 488e23ea57
4 changed files with 489 additions and 272 deletions

View File

@@ -58,6 +58,65 @@ namespace AIStudio.Wpf.Logical.ViewModels
}
}
public override void GetInput()
{
foreach (var input in Input)
{
var connector = GetSourceItem(input.Value);
if (connector == null)
{
continue;
}
if (connector.SourceConnectorInfo.DataItem is LogicalGateItemViewModelBase)
{
input.Value.ConnectorValue = (connector.SourceConnectorInfo as LogicalConnectorInfo).ConnectorValue;
input.Value.ColorViewModel.FillColor.Color = connector.SourceConnectorInfo.ColorViewModel.FillColor.Color;
connector.ColorViewModel.LineColor.Color = connector.SourceConnectorInfo.ColorViewModel.FillColor.Color;
connector.ColorViewModel.FillColor.Color = connector.SourceConnectorInfo.ColorViewModel.FillColor.Color;
if (LogicalType == LogicalType.Output)
{
input.Value.ValueTypePoint = (connector.SourceConnectorInfo as LogicalConnectorInfo).ValueTypePoint;
}
else if (LogicalType == LogicalType.NOT)
{
input.Value.ValueTypePoint = ((connector.SourceConnectorInfo as LogicalConnectorInfo).ValueTypePoint == ValueTypePoint.Bool) ? ValueTypePoint.Bool : ValueTypePoint.Int;
}
}
}
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
if (output.Value.ValueTypePoint == ValueTypePoint.Bool)
{
if (output.Value.ConnectorValue == 0)
{
output.Value.ColorViewModel.FillColor.Color = Colors.Red;
if (LogicalType == LogicalType.Output)
{
ColorViewModel.FillColor.Color = Colors.Red;
}
}
else
{
output.Value.ColorViewModel.FillColor.Color = Colors.Green;
if (LogicalType == LogicalType.Output)
{
ColorViewModel.FillColor.Color = Colors.Green;
}
}
}
else
{
output.Value.ColorViewModel.FillColor.Color = Colors.Green;
}
}
}
protected override void ExecuteEditCommand(object parameter)
{
@@ -78,6 +137,18 @@ namespace AIStudio.Wpf.Logical.ViewModels
}
}
}
protected ConnectionViewModel GetSourceItem(FullyCreatedConnectorInfo sinkConnector)
{
foreach (var connector in Root?.Items.OfType<ConnectionViewModel>())
{
if (connector.SinkConnectorInfo == sinkConnector)
{
return connector;
}
}
return null;
}
}
public class AddGateItemViewModel : LogicalGateItemViewModel
@@ -98,6 +169,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Input.Values.Select(p => p.ConnectorValue).Sum();
}
base.CalculateOutput();
}
}
public class SubtractGateItemViewModel : LogicalGateItemViewModel
@@ -118,6 +198,17 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
var first = Input.Values.Select(p => p.ConnectorValue).FirstOrDefault();
var second = Input.Values.Where((value, index) => index != 0).Select(p => p.ConnectorValue).Sum();
output.Value.ConnectorValue = first - second;
}
base.CalculateOutput();
}
}
public class MultiplyGateItemViewModel : LogicalGateItemViewModel
@@ -138,6 +229,24 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
double result = 0;
foreach (var input in Input.Values)
{
if (result == 0)
{
result = 1;
}
result *= input.ConnectorValue;
}
output.Value.ConnectorValue = result;
}
base.CalculateOutput();
}
}
public class DivideGateItemViewModel : LogicalGateItemViewModel
@@ -159,6 +268,20 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
double result = Input.Values.Select(p => p.ConnectorValue).FirstOrDefault();
foreach (var input in Input.Values.Where((value, index) => index != 0))
{
result /= input.ConnectorValue;
}
output.Value.ConnectorValue = result;
}
base.CalculateOutput();
}
}
public class AverageGateItemViewModel : LogicalGateItemViewModel
@@ -181,6 +304,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Input.Values.Select(p => p.ConnectorValue).Average();
}
base.CalculateOutput();
}
}
public class MODGateItemViewModel : LogicalGateItemViewModel
@@ -203,6 +335,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Input[0].ConnectorValue % Input[1].ConnectorValue;
}
base.CalculateOutput();
}
}
public class ANDGateItemViewModel : LogicalGateItemViewModel
@@ -225,6 +366,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Convert.ToInt32(Input[0].ConnectorValue) & Convert.ToInt32(Input[1].ConnectorValue);
}
base.CalculateOutput();
}
}
public class ORGateItemViewModel : LogicalGateItemViewModel
@@ -247,6 +397,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Convert.ToInt32(Input[0].ConnectorValue) | Convert.ToInt32(Input[1].ConnectorValue);
}
base.CalculateOutput();
}
}
public class XORGateItemViewModel : LogicalGateItemViewModel
@@ -269,6 +428,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Convert.ToInt32(Convert.ToInt32(Input[0].ConnectorValue) ^ Convert.ToInt32(Input[1].ConnectorValue));
}
base.CalculateOutput();
}
}
public class NOTGateItemViewModel : LogicalGateItemViewModel
@@ -291,6 +459,24 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
if (Input[0].ValueTypePoint == ValueTypePoint.Bool)
{
output.Value.ConnectorValue = Convert.ToInt32(!Convert.ToBoolean(Input[0].ConnectorValue));
output.Value.ValueTypePoint = ValueTypePoint.Bool;
}
else
{
output.Value.ConnectorValue = ~Convert.ToInt32(Input[0].ConnectorValue);
output.Value.ValueTypePoint = ValueTypePoint.Int;
}
}
base.CalculateOutput();
}
}
public class SHLGateItemViewModel : LogicalGateItemViewModel
@@ -313,6 +499,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Convert.ToInt32(Input[0].ConnectorValue) << Convert.ToInt32(Input[1].ConnectorValue);
}
base.CalculateOutput();
}
}
public class SHRGateItemViewModel : LogicalGateItemViewModel
@@ -335,6 +530,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Convert.ToInt32(Input[0].ConnectorValue) >> Convert.ToInt32(Input[1].ConnectorValue);
}
base.CalculateOutput();
}
}
public class ROLGateItemViewModel : LogicalGateItemViewModel
@@ -357,6 +561,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = (Convert.ToInt32(Input[0].ConnectorValue) << Convert.ToInt32(Input[1].ConnectorValue)) | (Convert.ToInt32(Input[0].ConnectorValue) >> 32 - Convert.ToInt32(Input[1].ConnectorValue));
}
base.CalculateOutput();
}
}
public class RORGateItemViewModel : LogicalGateItemViewModel
@@ -379,6 +592,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = (Convert.ToInt32(Input[0].ConnectorValue) >> Convert.ToInt32(Input[1].ConnectorValue)) | (Convert.ToInt32(Input[0].ConnectorValue) << 32 - Convert.ToInt32(Input[1].ConnectorValue));
}
base.CalculateOutput();
}
}
public class SELGateItemViewModel : LogicalGateItemViewModel
@@ -401,6 +623,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = (Input[0].ConnectorValue == output.Key) ? Input[1].ConnectorValue : Input[2].ConnectorValue;
}
base.CalculateOutput();
}
}
public class MAXGateItemViewModel : LogicalGateItemViewModel
@@ -423,6 +654,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Input.Values.Select(p => p.ConnectorValue).Max();
}
base.CalculateOutput();
}
}
public class MINGateItemViewModel : LogicalGateItemViewModel
@@ -445,6 +685,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Input.Values.Select(p => p.ConnectorValue).Min();
}
base.CalculateOutput();
}
}
public class LIMITGateItemViewModel : LogicalGateItemViewModel
@@ -467,6 +716,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = (Input[0].ConnectorValue > Input[1].ConnectorValue) ? Input[1].ConnectorValue : Input[0].ConnectorValue;
}
base.CalculateOutput();
}
}
public class GTGateItemViewModel : LogicalGateItemViewModel
@@ -489,6 +747,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = (Input[0].ConnectorValue > Input[1].ConnectorValue) ? 1 : 0;
}
base.CalculateOutput();
}
}
public class LTGateItemViewModel : LogicalGateItemViewModel
@@ -511,6 +778,14 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = (Input[0].ConnectorValue < Input[1].ConnectorValue) ? 1 : 0;
}
}
}
public class GEGateItemViewModel : LogicalGateItemViewModel
@@ -533,6 +808,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = (Input[0].ConnectorValue >= Input[1].ConnectorValue) ? 1 : 0;
}
base.CalculateOutput();
}
}
public class LEGateItemViewModel : LogicalGateItemViewModel
@@ -555,6 +839,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = (Input[0].ConnectorValue <= Input[1].ConnectorValue) ? 1 : 0;
}
base.CalculateOutput();
}
}
public class EQGateItemViewModel : LogicalGateItemViewModel
@@ -577,6 +870,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = (Input[0].ConnectorValue == Input[1].ConnectorValue) ? 1 : 0;
}
base.CalculateOutput();
}
}
public class NEGateItemViewModel : LogicalGateItemViewModel
@@ -599,6 +901,16 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = (Input[0].ConnectorValue != Input[1].ConnectorValue) ? 1 : 0;
}
base.CalculateOutput();
}
}
public class ABSGateItemViewModel : LogicalGateItemViewModel
@@ -621,6 +933,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Math.Abs(Input[0].ConnectorValue);
}
base.CalculateOutput();
}
}
public class SQRTGateItemViewModel : LogicalGateItemViewModel
@@ -643,6 +964,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Math.Sqrt(Input[0].ConnectorValue);
}
base.CalculateOutput();
}
}
public class LNGateItemViewModel : LogicalGateItemViewModel
@@ -665,6 +995,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Math.Log10(Input[0].ConnectorValue);
}
base.CalculateOutput();
}
}
public class LOGGateItemViewModel : LogicalGateItemViewModel
@@ -687,6 +1026,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Math.Log(Input[0].ConnectorValue);
}
base.CalculateOutput();
}
}
public class EXPGateItemViewModel : LogicalGateItemViewModel
@@ -709,6 +1057,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Math.Exp(Input[0].ConnectorValue);
}
base.CalculateOutput();
}
}
public class SINGateItemViewModel : LogicalGateItemViewModel
@@ -731,6 +1088,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Math.Sin(Input[0].ConnectorValue);
}
base.CalculateOutput();
}
}
public class COSGateItemViewModel : LogicalGateItemViewModel
@@ -753,6 +1119,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Math.Cos(Input[0].ConnectorValue);
}
base.CalculateOutput();
}
}
public class TANGateItemViewModel : LogicalGateItemViewModel
@@ -775,6 +1150,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Math.Tan(Input[0].ConnectorValue);
}
base.CalculateOutput();
}
}
public class ASINGateItemViewModel : LogicalGateItemViewModel
@@ -797,6 +1181,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Math.Asin(Input[0].ConnectorValue);
}
base.CalculateOutput();
}
}
public class ACOSGateItemViewModel : LogicalGateItemViewModel
@@ -819,6 +1212,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Math.Acos(Input[0].ConnectorValue);
}
base.CalculateOutput();
}
}
public class ATANGateItemViewModel : LogicalGateItemViewModel
@@ -841,6 +1243,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Math.Atan(Input[0].ConnectorValue);
}
base.CalculateOutput();
}
}
public class EXPTGateItemViewModel : LogicalGateItemViewModel
@@ -863,6 +1274,15 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Math.Exp(Input[0].ConnectorValue);
}
base.CalculateOutput();
}
}
public class ConstantDesignerItemViewModel : LogicalGateItemViewModel
@@ -886,6 +1306,20 @@ namespace AIStudio.Wpf.Logical.ViewModels
{
}
public override void GetInput()
{
//无输入
}
public override void CalculateOutput()
{
foreach (var output in Output)
{
output.Value.ConnectorValue = Value;
}
base.CalculateOutput();
}
}
public class InputItemViewModel : LogicalGateItemViewModel
@@ -941,6 +1375,23 @@ namespace AIStudio.Wpf.Logical.ViewModels
}
}
public override void GetInput()
{
//无输入
}
public override void CalculateOutput()
{
if (LinkPoint != null)
{
foreach (var output in Output)
{
output.Value.ConnectorValue = LinkPoint.Value;
}
}
base.CalculateOutput();
}
protected override void ExecuteEditCommand(object parameter)
{
LinkPointDesignerItemData data = new LinkPointDesignerItemData(LinkPoint);
@@ -1006,6 +1457,19 @@ namespace AIStudio.Wpf.Logical.ViewModels
}
}
public override void CalculateOutput()
{
var first = Input.Values.FirstOrDefault();
Value = first.ConnectorValue;
LinkPoint.Value = first.ConnectorValue;
foreach (var output in Output)
{
output.Value.ConnectorValue = first.ConnectorValue;
output.Value.ValueTypePoint = first.ValueTypePoint;
}
base.CalculateOutput();
}
protected override void ExecuteEditCommand(object parameter)
{
LinkPointDesignerItemData data = new LinkPointDesignerItemData(LinkPoint);