修复保存项目再开时连线重复添加了 start、end点

This commit is contained in:
fan.yaying
2023-08-22 15:44:09 +08:00
parent 67d995bb27
commit 38e0981bb9

View File

@@ -2,13 +2,10 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using AIStudio.Wpf.DiagramDesigner.Controls;
using AIStudio.Wpf.DiagramDesigner.Geometrys; using AIStudio.Wpf.DiagramDesigner.Geometrys;
using AIStudio.Wpf.DiagramDesigner.Helpers; using AIStudio.Wpf.DiagramDesigner.Helpers;
using SvgPathProperties; using SvgPathProperties;
@@ -31,7 +28,7 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
public ConnectionViewModel(IDiagramViewModel root, ConnectorInfoBase sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo, DrawMode drawMode = DrawMode.ConnectingLineSmooth, RouterMode routerMode = AIStudio.Wpf.DiagramDesigner.RouterMode.RouterNormal) : base(root) public ConnectionViewModel(IDiagramViewModel root, ConnectorInfoBase sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo, DrawMode drawMode = DrawMode.ConnectingLineSmooth, RouterMode routerMode = AIStudio.Wpf.DiagramDesigner.RouterMode.RouterNormal) : base(root)
{ {
_pathMode = drawMode.ToString(); _pathMode = drawMode.ToString();
_routerMode = routerMode.ToString(); _routerMode = routerMode.ToString();
Init(root, sourceConnectorInfo, sinkConnectorInfo); Init(root, sourceConnectorInfo, sinkConnectorInfo);
@@ -65,16 +62,16 @@ namespace AIStudio.Wpf.DiagramDesigner
if (sinkConnectorInfo is FullyCreatedConnectorInfo sink && sink.DataItem.ShowArrow == false) if (sinkConnectorInfo is FullyCreatedConnectorInfo sink && sink.DataItem.ShowArrow == false)
{ {
this.ShapeViewModel.SinkMarker = new SharpPath("", 10, 10, PathStyle.None, SizeStyle.Middle); this.ShapeViewModel.SinkMarker = new SharpPath("", 10, 10, PathStyle.None, SizeStyle.Middle);
} }
var routetype = TypeHelper.GetType(RouterMode); var routetype = TypeHelper.GetType(RouterMode);
Router = routetype != null ? (System.Activator.CreateInstance(routetype) as IRouter) : new RouterNormal(); Router = routetype != null ? (System.Activator.CreateInstance(routetype) as IRouter) : new RouterNormal();
var pathGeneratortype = TypeHelper.GetType(PathMode); var pathGeneratortype = TypeHelper.GetType(PathMode);
PathGenerator = pathGeneratortype != null ? (System.Activator.CreateInstance(pathGeneratortype) as IPathGenerator) : new ConnectingLineSmooth(); PathGenerator = pathGeneratortype != null ? (System.Activator.CreateInstance(pathGeneratortype) as IPathGenerator) : new ConnectingLineSmooth();
IsLoaded= true; IsLoaded = true;
this.SourceConnectorInfo = sourceConnectorInfo; this.SourceConnectorInfo = sourceConnectorInfo;
this.SinkConnectorInfo = sinkConnectorInfo; this.SinkConnectorInfo = sinkConnectorInfo;
DeleteConnectionCommand = new SimpleCommand(Command_Enable, DeleteConnection); DeleteConnectionCommand = new SimpleCommand(Command_Enable, DeleteConnection);
AddVertexCommand = new SimpleCommand(Command_Enable, AddVertex); AddVertexCommand = new SimpleCommand(Command_Enable, AddVertex);
@@ -87,8 +84,18 @@ namespace AIStudio.Wpf.DiagramDesigner
if (designerbase is ConnectionItem designer) if (designerbase is ConnectionItem designer)
{ {
Vertices = new ObservableCollection<ConnectorVertexModel>(designer.Vertices.Select(p => new ConnectorVertexModel(this.Root, this, designer))); Vertices = new ObservableCollection<ConnectorVertexModel>(designer.Vertices.Select(p => {
Labels = new ObservableCollection<ConnectorLabelModel>(designer.Labels.Select(p => new ConnectorLabelModel(this.Root, this, designer))); ConnectorVertexModel temp = new ConnectorVertexModel(this.Root, this, designer) { ConnectorVertexType = p.ConnectorVertexType };
return temp;
}));
Labels = new ObservableCollection<ConnectorLabelModel>(designer.Labels.Select(p => {
ConnectorLabelModel temp = new ConnectorLabelModel(this.Root, this, designer)
{
Distance = p.Distance,
Offset = p.Offset
};
return temp;
}));
} }
} }
@@ -475,7 +482,7 @@ namespace AIStudio.Wpf.DiagramDesigner
protected override void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) protected override void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{ {
if (IsLoaded == false || IsInternalChanged == true ) return; if (IsLoaded == false || IsInternalChanged == true) return;
if (sender is ConnectionViewModel) if (sender is ConnectionViewModel)
{ {
@@ -577,7 +584,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{ {
UpdatePathGeneratorResult(); UpdatePathGeneratorResult();
} }
else if(connectorVertexModel.ConnectorVertexType == ConnectorVertexType.Start) else if (connectorVertexModel.ConnectorVertexType == ConnectorVertexType.Start)
{ {
var nearPort = Root.FindNearPortToAttachTo(this, ConnectorVertexType.Start); var nearPort = Root.FindNearPortToAttachTo(this, ConnectorVertexType.Start);
SetSourcePort(new PartCreatedConnectorInfo(connectorVertexModel.Position.X, connectorVertexModel.Position.Y)); SetSourcePort(new PartCreatedConnectorInfo(connectorVertexModel.Position.X, connectorVertexModel.Position.Y));
@@ -683,12 +690,12 @@ namespace AIStudio.Wpf.DiagramDesigner
StartAngle = PathGeneratorResult.SourceMarkerAngle; StartAngle = PathGeneratorResult.SourceMarkerAngle;
EndAngle = PathGeneratorResult.TargetMarkerAngle; EndAngle = PathGeneratorResult.TargetMarkerAngle;
StartPoint = new PointBase(source.Value.X - Area.Left , source.Value.Y - Area.Top ); StartPoint = new PointBase(source.Value.X - Area.Left, source.Value.Y - Area.Top);
EndPoint = new PointBase(target.Value.X - Area.Left , target.Value.Y - Area.Top); EndPoint = new PointBase(target.Value.X - Area.Left, target.Value.Y - Area.Top);
var startVertice = Vertices.FirstOrDefault(p => p.ConnectorVertexType == ConnectorVertexType.Start); var startVertice = Vertices.FirstOrDefault(p => p.ConnectorVertexType == ConnectorVertexType.Start);
if (startVertice == null) if (startVertice == null)
{ {
startVertice = AddEndsVertex(StartPoint, ConnectorVertexType.Start); startVertice = AddEndsVertex(StartPoint, ConnectorVertexType.Start);
} }
else else
@@ -697,7 +704,7 @@ namespace AIStudio.Wpf.DiagramDesigner
startVertice.SetPosition(StartPoint); startVertice.SetPosition(StartPoint);
IsInternalChanged = true; IsInternalChanged = true;
} }
startVertice.ColorViewModel.FillColor.Color = SourceConnectorInfoFully != null? Colors.DarkRed : Colors.Blue; startVertice.ColorViewModel.FillColor.Color = SourceConnectorInfoFully != null ? Colors.DarkRed : Colors.Blue;
startVertice.ColorViewModel.LineColor.Color = SourceConnectorInfoFully != null ? Colors.DarkRed : Colors.Blue; startVertice.ColorViewModel.LineColor.Color = SourceConnectorInfoFully != null ? Colors.DarkRed : Colors.Blue;
var endVertice = Vertices.FirstOrDefault(p => p.ConnectorVertexType == ConnectorVertexType.End); var endVertice = Vertices.FirstOrDefault(p => p.ConnectorVertexType == ConnectorVertexType.End);
@@ -957,7 +964,7 @@ namespace AIStudio.Wpf.DiagramDesigner
public ConnectorVertexModel AddEndsVertex(PointBase pointBase, ConnectorVertexType connectorVertexType) public ConnectorVertexModel AddEndsVertex(PointBase pointBase, ConnectorVertexType connectorVertexType)
{ {
var vertice = new ConnectorVertexModel(this, pointBase); var vertice = new ConnectorVertexModel(this, pointBase);
vertice.ConnectorVertexType= connectorVertexType; vertice.ConnectorVertexType = connectorVertexType;
vertice.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler; vertice.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler;
Vertices.Add(vertice); Vertices.Add(vertice);