diff --git a/AIStudio.Wpf.DiagramDesigner.Additionals/AIStudio.Wpf.DiagramDesigner.Additionals_0cqkgbph_wpftmp.csproj b/AIStudio.Wpf.DiagramDesigner.Additionals/AIStudio.Wpf.DiagramDesigner.Additionals_0cqkgbph_wpftmp.csproj
new file mode 100644
index 0000000..b465f44
--- /dev/null
+++ b/AIStudio.Wpf.DiagramDesigner.Additionals/AIStudio.Wpf.DiagramDesigner.Additionals_0cqkgbph_wpftmp.csproj
@@ -0,0 +1,293 @@
+
+
+ AIStudio.Wpf.DiagramDesigner.Additionals
+ obj\Debug\
+ obj\
+ F:\aistudio.-wpf.-diagram\AIStudio.Wpf.DiagramDesigner.Additionals\obj\
+ <_TargetAssemblyProjectName>AIStudio.Wpf.DiagramDesigner.Additionals
+
+
+
+ true
+ true
+ AIStudio.Wpf.Controls
+ akwkevin
+ https://gitee.com/akwkevin
+ A.png
+
+
+ 1.0.1
+ 一个Wpf的Diagram控件帮助库
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AIStudio.Wpf.DiagramDesigner.Serializable/DiagramDataExtention.cs b/AIStudio.Wpf.DiagramDesigner.Serializable/DiagramDataExtention.cs
index 4910ba6..49c373c 100644
--- a/AIStudio.Wpf.DiagramDesigner.Serializable/DiagramDataExtention.cs
+++ b/AIStudio.Wpf.DiagramDesigner.Serializable/DiagramDataExtention.cs
@@ -66,9 +66,9 @@ namespace AIStudio.Wpf.DiagramDesigner.Serializable
diagramLink.Label = linkModel.Text;
diagramLink.ZIndex = linkModel.ZIndex;
- if (linkModel.IsFullConnection)
+ if (linkModel.IsFullConnection)
{
- diagramLink.SourceId = linkModel.SourceConnectorInfo.DataItem.Id.ToString();
+ diagramLink.SourceId = linkModel.SourceConnectorInfoFully.DataItem.Id.ToString();
diagramLink.TargetId = linkModel.SinkConnectorInfoFully.DataItem.Id.ToString();
diagramLink.Router = linkModel.RouterMode;
@@ -80,10 +80,10 @@ namespace AIStudio.Wpf.DiagramDesigner.Serializable
diagramLink.Type = diagramLink.GetType().Name;
- diagramLink.SourcePortAlignment = linkModel.SourceConnectorInfo.Orientation.ToString();
+ diagramLink.SourcePortAlignment = linkModel.SourceConnectorInfoFully.Orientation.ToString();
diagramLink.TargetPortAlignment = linkModel.SinkConnectorInfoFully.Orientation.ToString();
}
- else
+ else//Todo,半连接线也可反序列化
{
return null;
}
diff --git a/AIStudio.Wpf.DiagramDesigner/Algorithms/LinksReconnectionAlgorithms.cs b/AIStudio.Wpf.DiagramDesigner/Algorithms/LinksReconnectionAlgorithms.cs
index 972cab1..1a5a4d4 100644
--- a/AIStudio.Wpf.DiagramDesigner/Algorithms/LinksReconnectionAlgorithms.cs
+++ b/AIStudio.Wpf.DiagramDesigner/Algorithms/LinksReconnectionAlgorithms.cs
@@ -17,12 +17,12 @@ namespace AIStudio.Wpf.DiagramDesigner.Algorithms
if (link.IsFullConnection == false)
continue;
- var sourcePorts = link.SourceConnectorInfo.DataItem.Connectors;
+ var sourcePorts = link.SourceConnectorInfoFully.DataItem.Connectors;
var targetPorts = link.SinkConnectorInfoFully.DataItem.Connectors;
// Find the ports with minimal distance
var minDistance = double.MaxValue;
- var minSourcePort = link.SourceConnectorInfo;
+ var minSourcePort = link.SourceConnectorInfoFully;
var minTargetPort = link.SinkConnectorInfoFully;
foreach (var sourcePort in sourcePorts)
{
@@ -41,16 +41,16 @@ namespace AIStudio.Wpf.DiagramDesigner.Algorithms
// Reconnect
if (link.SourceConnectorInfo != minSourcePort)
{
- //portsToRefresh.Add(link.SourceConnectorInfo);
+ //portsToRefresh.Add(link.SourceConnectorInfoFully);
//portsToRefresh.Add(minSourcePort);
- link.SetSourcePort(minSourcePort);
+ link.SourceConnectorInfo = minSourcePort;
}
if (link.SinkConnectorInfo != minTargetPort)
{
//portsToRefresh.Add(link.SinkConnectorInfoFully);
//portsToRefresh.Add(minTargetPort);
- link.SetSinkPort(minTargetPort);
+ link.SinkConnectorInfo = minTargetPort;
}
}
diff --git a/AIStudio.Wpf.DiagramDesigner/Controls/Connector.cs b/AIStudio.Wpf.DiagramDesigner/Controls/Connector.cs
index 58ac648..d8bcaa9 100644
--- a/AIStudio.Wpf.DiagramDesigner/Controls/Connector.cs
+++ b/AIStudio.Wpf.DiagramDesigner/Controls/Connector.cs
@@ -32,14 +32,14 @@ namespace AIStudio.Wpf.DiagramDesigner
return element as DesignerCanvas;
}
- public FullyCreatedConnectorInfo Info
+ public ConnectorInfoBase Info
{
get
{
- if (Content is FullyCreatedConnectorInfo connectorInfo)
+ if (Content is ConnectorInfoBase connectorInfo)
return connectorInfo;
- return this.DataContext as FullyCreatedConnectorInfo;
+ return this.DataContext as ConnectorInfoBase;
}
}
diff --git a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs
index e2f2fd4..589e330 100644
--- a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs
+++ b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs
@@ -37,7 +37,7 @@ namespace AIStudio.Wpf.DiagramDesigner
return DiagramServicesProvider.Instance.Provider;
}
}
- private ConnectionViewModel partialConnection;
+ private ConnectionViewModel partialConnection;
private Point? rubberbandSelectionStartPoint = null;
@@ -54,11 +54,14 @@ namespace AIStudio.Wpf.DiagramDesigner
{
sourceConnector = value;
- FullyCreatedConnectorInfo sourceDataItem = sourceConnector.Info;
+ ConnectorInfoBase sourceDataItem = sourceConnector.Info;
+
+ //Rect rectangleBounds = sourceConnector.TransformToVisual(this).TransformBounds(new Rect(sourceConnector.RenderSize));
+ //Point point = new Point(rectangleBounds.Left + (rectangleBounds.Width / 2),
+ // rectangleBounds.Bottom + (rectangleBounds.Height / 2));
+
+ Point point = sourceDataItem.MiddlePosition;
- Rect rectangleBounds = sourceConnector.TransformToVisual(this).TransformBounds(new Rect(sourceConnector.RenderSize));
- Point point = new Point(rectangleBounds.Left + (rectangleBounds.Width / 2),
- rectangleBounds.Bottom + (rectangleBounds.Height / 2));
partialConnection = new ConnectionViewModel(_viewModel, sourceDataItem, new PartCreatedConnectorInfo(point.X, point.Y), DrawMode, RouterMode);
_viewModel.Add(partialConnection);
@@ -127,7 +130,7 @@ namespace AIStudio.Wpf.DiagramDesigner
}
}
}
-
+
#region GridCellSize
public static readonly DependencyProperty GridCellSizeProperty =
@@ -350,13 +353,24 @@ namespace AIStudio.Wpf.DiagramDesigner
{
// in case that this click is the start for a
// drag operation we cache the start point
- rubberbandSelectionStartPoint = e.GetPosition(this);
+ Point currentPoint = e.GetPosition(this);
+ rubberbandSelectionStartPoint = currentPoint;
if (!(Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)))
{
_viewModel.ClearSelectedItems();
}
+
+ if (_service.DrawModeViewModel.LineDrawModeSelected)//画线模式,可以不命中实体
+ {
+ if (SourceConnector == null)
+ {
+ //新建一个Part连接点
+ SourceConnector = new Connector() { Content = new PartCreatedConnectorInfo(currentPoint.X, currentPoint.Y) };
+ }
+ }
+
e.Handled = true;
}
}
@@ -365,8 +379,8 @@ namespace AIStudio.Wpf.DiagramDesigner
protected override void OnMouseMove(MouseEventArgs e)
{
- var focusedElement = Keyboard.FocusedElement;
- Debug.WriteLine("focusedElement:" + focusedElement?.ToString());
+ //var focusedElement = Keyboard.FocusedElement;
+ //Debug.WriteLine("focusedElement:" + focusedElement?.ToString());
base.OnMouseMove(e);
@@ -440,32 +454,36 @@ namespace AIStudio.Wpf.DiagramDesigner
if (sourceConnector != null)
{
- FullyCreatedConnectorInfo sourceDataItem = sourceConnector.Info;
+ ConnectorInfoBase sourceDataItem = sourceConnector.Info;
if (sinkConnector != null)
{
+ ConnectorInfoBase sinkDataItem = sinkConnector.Info;
- FullyCreatedConnectorInfo sinkDataItem = sinkConnector.Info;
-
- int indexOfLastTempConnection = sinkDataItem.DataItem.Root.Items.Count - 1;
- sinkDataItem.DataItem.Root.Remove(
- sinkDataItem.DataItem.Root.Items[indexOfLastTempConnection]);
- sinkDataItem.DataItem.Root.AddItemCommand.Execute(new ConnectionViewModel(_viewModel, sourceDataItem, sinkDataItem, DrawMode, RouterMode));
+ _viewModel.Remove(partialConnection);
+ _viewModel.AddItemCommand.Execute(new ConnectionViewModel(_viewModel, sourceDataItem, sinkDataItem, DrawMode, RouterMode));
}
else if (partialConnection.IsFullConnection)//自动连接模式
{
partialConnection.RaiseFullConnection();
}
+ else if (_service.DrawModeViewModel.LineDrawModeSelected)
+ {
+ Point currentPoint = e.GetPosition(this);
+ ConnectorInfoBase sinkDataItem = new PartCreatedConnectorInfo(currentPoint.X, currentPoint.Y);
+
+ _viewModel.Remove(partialConnection);
+ _viewModel.AddItemCommand.Execute(new ConnectionViewModel(_viewModel, sourceDataItem, sinkDataItem, DrawMode, RouterMode));
+ }
else
{
//Need to remove last item as we did not finish drawing the path
- int indexOfLastTempConnection = sourceDataItem.DataItem.Root.Items.Count - 1;
- sourceDataItem.DataItem.Root.Remove(
- sourceDataItem.DataItem.Root.Items[indexOfLastTempConnection]);
+ _viewModel.Remove(partialConnection);
}
}
sourceConnector = null;
sinkConnector = null;
+ partialConnection = null;
if (_service.DrawModeViewModel.GetDrawMode() != DrawMode.DirectLine)
{
@@ -534,7 +552,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{
if (hitObject is Connector connector)
{
- return connector;
+ return connector;
}
hitObject = VisualTreeHelper.GetParent(hitObject);
}
@@ -622,7 +640,7 @@ namespace AIStudio.Wpf.DiagramDesigner
foreach (var port in _viewModel.Items.OfType().ToList().SelectMany(n => n.Connectors))
{
if (partialConnection.OnGoingPosition.DistanceTo(port.Position) < SnappingRadius &&
- partialConnection.SourceConnectorInfo.CanAttachTo(port))
+ partialConnection.SourceConnectorInfoFully?.CanAttachTo(port) == true)
return port;
}
diff --git a/AIStudio.Wpf.DiagramDesigner/Controls/DragThumb.cs b/AIStudio.Wpf.DiagramDesigner/Controls/DragThumb.cs
index 5b27208..4addae6 100644
--- a/AIStudio.Wpf.DiagramDesigner/Controls/DragThumb.cs
+++ b/AIStudio.Wpf.DiagramDesigner/Controls/DragThumb.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Windows;
@@ -44,10 +45,14 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
designerItems.AddRange(designerItem.Root.SelectionService.GetGroupMembers(groupable).OfType());
}
+ //拖动连线,把连接者也一起移动
if (designerItem is ConnectionViewModel connector)
{
- designerItems.Add(connector.SourceConnectorInfo.DataItem);
- if (connector.IsFullConnection)
+ if (connector.SourceConnectorInfoFully != null)
+ {
+ designerItems.Add(connector.SourceConnectorInfoFully.DataItem);
+ }
+ if (connector.SinkConnectorInfoFully != null)
{
designerItems.Add(connector.SinkConnectorInfoFully.DataItem);
}
@@ -66,6 +71,13 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
item.SetOldValue(item.TopLeft, nameof(item.TopLeft));
}
+ //部分连接点可以移动
+ foreach (ConnectionViewModel item in designerItems.OfType())
+ {
+ item.SourceConnectorInfoPart?.SetOldValue(item.SourceConnectorInfoPart.Position, nameof(item.SourceConnectorInfoPart.Position));
+ item.SinkConnectorInfoPart?.SetOldValue(item.SinkConnectorInfoPart.Position, nameof(item.SinkConnectorInfoPart.Position));
+ }
+
e.Handled = true;
}
else
@@ -76,10 +88,10 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
private void DragThumb_DragCompleted(object sender, DragCompletedEventArgs e)
{
- if (drag == false)
+ if (drag == false)
{
Interlocked.Decrement(ref DiagramViewModel.DoCommandManager.BeginDo);
- return;
+ return;
}
if (designerItems != null)
@@ -92,6 +104,16 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
Dictionary> infos =
designerItems.OfType().ToDictionary(p => p,
p => new Tuple(p.GetOldValue(nameof(p.TopLeft)), p.TopLeft));
+
+ //部分连接点可以移动
+ Dictionary, Tuple>> conncetorinfos =
+ designerItems.OfType().ToDictionary(p => p,
+ p => new Tuple, Tuple>(
+ new Tuple(p.SourceConnectorInfoPart?.GetOldValue(nameof(p.SourceConnectorInfoPart.Position)),
+ p.SinkConnectorInfoPart?.GetOldValue(nameof(p.SinkConnectorInfoPart.Position))),
+ new Tuple(p.SourceConnectorInfoPart?.Position,
+ p.SinkConnectorInfoPart?.Position)));
+
Interlocked.Decrement(ref DiagramViewModel.DoCommandManager.BeginDo);
DiagramViewModel.DoCommandManager.DoNewCommand(this.ToString(),
() => {
@@ -99,12 +121,20 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
{
info.Key.TopLeft = info.Value.Item2;
}
+ foreach (var info in conncetorinfos)
+ {
+ info.Key.SetPartPostion(info.Value.Item2.Item1, info.Value.Item2.Item2);
+ }
},
() => {
foreach (var info in infos)
{
info.Key.TopLeft = info.Value.Item1;
}
+ foreach (var info in conncetorinfos)
+ {
+ info.Key.SetPartPostion(info.Value.Item1.Item1, info.Value.Item1.Item2);
+ }
});
e.Handled = true;
}
@@ -121,6 +151,22 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
item.Top += e.VerticalChange;
}
+ //部分连接点可以移动
+ foreach (ConnectionViewModel item in designerItems.OfType())
+ {
+ PointBase? sourcePoint = null;
+ PointBase? sinkPoint = null;
+ if (item.SourceConnectorInfoPart != null)
+ {
+ sourcePoint = new PointBase(item.SourceConnectorInfoPart.Position.X + e.HorizontalChange, item.SourceConnectorInfoPart.Position.Y + e.VerticalChange);
+ }
+ if (item.SinkConnectorInfoPart != null)
+ {
+ sinkPoint = new PointBase(item.SinkConnectorInfoPart.Position.X + e.HorizontalChange, item.SinkConnectorInfoPart.Position.Y + e.VerticalChange);
+ }
+ item.SetPartPostion(sourcePoint, sinkPoint);
+ }
+
e.Handled = true;
}
}
diff --git a/AIStudio.Wpf.DiagramDesigner/Helpers/ControlExtession.cs b/AIStudio.Wpf.DiagramDesigner/Helpers/ControlExtession.cs
index f4c02ef..e3ce42d 100644
--- a/AIStudio.Wpf.DiagramDesigner/Helpers/ControlExtession.cs
+++ b/AIStudio.Wpf.DiagramDesigner/Helpers/ControlExtession.cs
@@ -370,13 +370,13 @@ namespace AIStudio.Wpf.DiagramDesigner
///
/// Tries to locate a given item within the visual tree,
- /// starting with the dependency object at a given position.
+ /// starting with the dependency object at a given _position.
///
/// The type of the element to be found
/// on the visual tree of the element at the given location.
/// The main element which is used to perform
/// hit testing.
- /// The position to be evaluated on the origin.
+ /// The _position to be evaluated on the origin.
public static T TryFindFromPoint(UIElement reference, Point point)
where T : DependencyObject
{
diff --git a/AIStudio.Wpf.DiagramDesigner/Helpers/VisualHelper.cs b/AIStudio.Wpf.DiagramDesigner/Helpers/VisualHelper.cs
index f8348ba..78e9ebf 100644
--- a/AIStudio.Wpf.DiagramDesigner/Helpers/VisualHelper.cs
+++ b/AIStudio.Wpf.DiagramDesigner/Helpers/VisualHelper.cs
@@ -441,13 +441,13 @@ namespace AIStudio.Wpf.DiagramDesigner.Helpers
///
/// Tries to locate a given item within the visual tree,
- /// starting with the dependency object at a given position.
+ /// starting with the dependency object at a given _position.
///
/// The type of the element to be found
/// on the visual tree of the element at the given location.
/// The main element which is used to perform
/// hit testing.
- /// The position to be evaluated on the origin.
+ /// The _position to be evaluated on the origin.
public static T TryFindFromPoint(UIElement reference, Point point)
where T : DependencyObject
{
diff --git a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/ConnectionItem.cs b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/ConnectionItem.cs
index b39b067..64318ac 100644
--- a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/ConnectionItem.cs
+++ b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/ConnectionItem.cs
@@ -23,16 +23,16 @@ namespace AIStudio.Wpf.DiagramDesigner
}
- public ConnectionItem(ConnectionViewModel viewmodel) : base(viewmodel)
+ public ConnectionItem(ConnectionViewModel viewmodel) : base(viewmodel)//Todo,半连接线也可序列化
{
- this.SourceId = viewmodel.SourceConnectorInfo.DataItem.Id;
- this.SourceOrientation = viewmodel.SourceConnectorInfo.Orientation;
- this.SourceType = viewmodel.SourceConnectorInfo.DataItem.GetType();
- this.SourceTypeName = viewmodel.SourceConnectorInfo.DataItem.GetType().FullName;
- this.SourceXRatio = viewmodel.SourceConnectorInfo.GetXRatioFromConnector();
- this.SourceYRatio = viewmodel.SourceConnectorInfo.GetYRatioFromConnector();
- this.SourceInnerPoint = viewmodel.SourceConnectorInfo.IsInnerPoint;
- this.SourceIsPortless = viewmodel.SourceConnectorInfo.IsPortless;
+ this.SourceId = viewmodel.SourceConnectorInfoFully.DataItem.Id;
+ this.SourceOrientation = viewmodel.SourceConnectorInfoFully.Orientation;
+ this.SourceType = viewmodel.SourceConnectorInfoFully.DataItem.GetType();
+ this.SourceTypeName = viewmodel.SourceConnectorInfoFully.DataItem.GetType().FullName;
+ this.SourceXRatio = viewmodel.SourceConnectorInfoFully.GetXRatioFromConnector();
+ this.SourceYRatio = viewmodel.SourceConnectorInfoFully.GetYRatioFromConnector();
+ this.SourceInnerPoint = viewmodel.SourceConnectorInfoFully.IsInnerPoint;
+ this.SourceIsPortless = viewmodel.SourceConnectorInfoFully.IsPortless;
this.SinkId = viewmodel.SinkConnectorInfoFully.DataItem.Id;
this.SinkOrientation = viewmodel.SinkConnectorInfoFully.Orientation;
@@ -41,7 +41,7 @@ namespace AIStudio.Wpf.DiagramDesigner
this.SinkXRatio = viewmodel.SinkConnectorInfoFully.GetXRatioFromConnector();
this.SinkYRatio = viewmodel.SinkConnectorInfoFully.GetYRatioFromConnector();
this.SinkInnerPoint = viewmodel.SinkConnectorInfoFully.IsInnerPoint;
- this.SinkIsPortless = viewmodel.SourceConnectorInfo.IsPortless;
+ this.SinkIsPortless = viewmodel.SourceConnectorInfoFully.IsPortless;
this.RouterMode = viewmodel.RouterMode;
this.PathMode = viewmodel.PathMode;
diff --git a/AIStudio.Wpf.DiagramDesigner/PathGenerators/PathGenerators.Boundary.cs b/AIStudio.Wpf.DiagramDesigner/PathGenerators/PathGenerators.Boundary.cs
index 2d226c7..cb791c3 100644
--- a/AIStudio.Wpf.DiagramDesigner/PathGenerators/PathGenerators.Boundary.cs
+++ b/AIStudio.Wpf.DiagramDesigner/PathGenerators/PathGenerators.Boundary.cs
@@ -33,8 +33,8 @@ namespace AIStudio.Wpf.DiagramDesigner
private static PointBase[] GetRouteWithMiddlePoints(IDiagramViewModel _, ConnectionViewModel link, PointBase[] route)
{
var middle = GetMiddlePoints(
- link.SourceConnectorInfo.MiddlePosition,
- link.SourceConnectorInfo.Orientation,
+ link.SourceConnectorInfoFully.MiddlePosition,
+ link.SourceConnectorInfoFully.Orientation,
link.SinkConnectorInfo.MiddlePosition,
link.IsFullConnection ? link.SinkConnectorInfoFully.Orientation : (link.SinkConnectorInfo.MiddlePosition.Y >= link.SourceConnectorInfo.MiddlePosition.Y ? ConnectorOrientation.Top : ConnectorOrientation.Bottom),
_.GridCellSize,
diff --git a/AIStudio.Wpf.DiagramDesigner/PathGenerators/PathGenerators.Corner.cs b/AIStudio.Wpf.DiagramDesigner/PathGenerators/PathGenerators.Corner.cs
index 3201616..af4d898 100644
--- a/AIStudio.Wpf.DiagramDesigner/PathGenerators/PathGenerators.Corner.cs
+++ b/AIStudio.Wpf.DiagramDesigner/PathGenerators/PathGenerators.Corner.cs
@@ -37,10 +37,10 @@ namespace AIStudio.Wpf.DiagramDesigner
private static PointBase[] GetRouteWithFullConnectionLine(IDiagramViewModel _, ConnectionViewModel link, PointBase[] route)
{
- var sourceInnerPoint = link.SourceConnectorInfo.IsInnerPoint;
- PointBase sourcePoint = link.SourceConnectorInfo.MiddlePosition;
+ var sourceInnerPoint = link.SourceConnectorInfoFully.IsInnerPoint;
+ PointBase sourcePoint = link.SourceConnectorInfoFully.MiddlePosition;
PointBase sinkPoint = link.SinkConnectorInfo.MiddlePosition;
- ConnectorOrientation sourceOrientation = link.SourceConnectorInfo.Orientation;
+ ConnectorOrientation sourceOrientation = link.SourceConnectorInfoFully.Orientation;
ConnectorOrientation sinkOrientation = link.SinkConnectorInfoFully.Orientation;
List linePoints = new List();
@@ -242,7 +242,7 @@ namespace AIStudio.Wpf.DiagramDesigner
private static PointBase[] GetRouteWithPartConnectionLine(IDiagramViewModel diagramViewModel, ConnectionViewModel link, PointBase[] route)
{
- var sourceInnerPoint = link.SourceConnectorInfo.IsInnerPoint;
+ var sourceInnerPoint = link.SourceConnectorInfoFully?.IsInnerPoint ?? false;
PointBase sourcePoint = link.SourceConnectorInfo.MiddlePosition;
PointBase sinkPoint = link.SinkConnectorInfo.MiddlePosition;
ConnectorOrientation sourceOrientation = link.SourceConnectorInfo.Orientation;
@@ -301,8 +301,8 @@ namespace AIStudio.Wpf.DiagramDesigner
linePoints = OptimizeLinePoints(linePoints, new RectangleBase[] { rectSource }, sourceOrientation, preferredOrientation);
else
linePoints = OptimizeLinePoints(linePoints, new RectangleBase[] { rectSource }, sourceOrientation, GetOpositeOrientation(sourceOrientation));
-
- linePoints.Insert(0, sourcePoint);
+
+ linePoints.Insert(0, sourcePoint);
return linePoints.ToArray();
}
diff --git a/AIStudio.Wpf.DiagramDesigner/PathGenerators/PathGenerators.Smooth.cs b/AIStudio.Wpf.DiagramDesigner/PathGenerators/PathGenerators.Smooth.cs
index 7dd2c7e..196d993 100644
--- a/AIStudio.Wpf.DiagramDesigner/PathGenerators/PathGenerators.Smooth.cs
+++ b/AIStudio.Wpf.DiagramDesigner/PathGenerators/PathGenerators.Smooth.cs
@@ -70,7 +70,7 @@ namespace AIStudio.Wpf.DiagramDesigner
var cX = (route[0].X + route[1].X) / 2;
var cY = (route[0].Y + route[1].Y) / 2;
- var sourceOrientation = link.SourceConnectorInfo?.Orientation;
+ var sourceOrientation = link.SourceConnectorInfo.Orientation;
if (sourceOrientation == ConnectorOrientation.None)//按照线条的四象限来处理。
{
var slope = (route[1].Y - route[0].Y) / (route[1].X - route[0].X);
diff --git a/AIStudio.Wpf.DiagramDesigner/Routers/Routers.FishBone.cs b/AIStudio.Wpf.DiagramDesigner/Routers/Routers.FishBone.cs
index c4d0aea..5528b7e 100644
--- a/AIStudio.Wpf.DiagramDesigner/Routers/Routers.FishBone.cs
+++ b/AIStudio.Wpf.DiagramDesigner/Routers/Routers.FishBone.cs
@@ -18,10 +18,10 @@ namespace AIStudio.Wpf.DiagramDesigner
if (link.IsFullConnection == false)
return Normal(_, link);
- double x2 = link.SourceConnectorInfo.MiddlePosition.X < link.SinkConnectorInfoFully.MiddlePosition.X ?
- link.SinkConnectorInfoFully.MiddlePosition.X - Math.Abs(link.SourceConnectorInfo.MiddlePosition.Y - link.SinkConnectorInfoFully.MiddlePosition.Y)
- : link.SinkConnectorInfoFully.MiddlePosition.X + Math.Abs(link.SourceConnectorInfo.MiddlePosition.Y - link.SinkConnectorInfoFully.MiddlePosition.Y);
- double y2 = link.SourceConnectorInfo.MiddlePosition.Y;
+ double x2 = link.SourceConnectorInfoFully.MiddlePosition.X < link.SinkConnectorInfoFully.MiddlePosition.X ?
+ link.SinkConnectorInfoFully.MiddlePosition.X - Math.Abs(link.SourceConnectorInfoFully.MiddlePosition.Y - link.SinkConnectorInfoFully.MiddlePosition.Y)
+ : link.SinkConnectorInfoFully.MiddlePosition.X + Math.Abs(link.SourceConnectorInfoFully.MiddlePosition.Y - link.SinkConnectorInfoFully.MiddlePosition.Y);
+ double y2 = link.SourceConnectorInfoFully.MiddlePosition.Y;
return new PointBase[] { new PointBase(x2, y2) };
diff --git a/AIStudio.Wpf.DiagramDesigner/Routers/Routers.Orthogonal.cs b/AIStudio.Wpf.DiagramDesigner/Routers/Routers.Orthogonal.cs
index 15d168c..5f35952 100644
--- a/AIStudio.Wpf.DiagramDesigner/Routers/Routers.Orthogonal.cs
+++ b/AIStudio.Wpf.DiagramDesigner/Routers/Routers.Orthogonal.cs
@@ -23,13 +23,13 @@ namespace AIStudio.Wpf.DiagramDesigner
var spots = new List();
var verticals = new List();
var horizontals = new List();
- var sideA = link.SourceConnectorInfo.Orientation;
+ var sideA = link.SourceConnectorInfoFully.Orientation;
var sideAVertical = IsVerticalSide(sideA);
var sideB = link.SinkConnectorInfo.Orientation;
var sideBVertical = IsVerticalSide(sideB);
- var originA = GetPortPositionBasedOnAlignment(link.SourceConnectorInfo);
+ var originA = GetPortPositionBasedOnAlignment(link.SourceConnectorInfoFully);
var originB = GetPortPositionBasedOnAlignment(link.SinkConnectorInfo);
- var shapeA = link.SourceConnectorInfo.DataItem.GetBounds(includePorts: true);
+ var shapeA = link.SourceConnectorInfoFully.DataItem.GetBounds(includePorts: true);
var shapeB = link.SinkConnectorInfoFully.DataItem.GetBounds(includePorts: true);
var inflatedA = shapeA.InflateRectangle(shapeMargin, shapeMargin);
var inflatedB = shapeB.InflateRectangle(shapeMargin, shapeMargin);
diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml
index 1e4eff3..9872da9 100644
--- a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml
+++ b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml
@@ -537,7 +537,7 @@
-
diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml b/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml
index 35d66b4..719cbc0 100644
--- a/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml
+++ b/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml
@@ -71,36 +71,6 @@
-
-
SourceConnectorInfo.IsPortless || SinkConnectorInfoFully?.IsPortless == true;
+ public bool IsPortless => SourceConnectorInfoFully?.IsPortless == true || SinkConnectorInfoFully?.IsPortless == true;
#endregion
#region 方法
@@ -476,18 +508,29 @@ namespace AIStudio.Wpf.DiagramDesigner
case nameof(SourceConnectorInfo):
if (SourceConnectorInfo != null)
{
- SourceA = PointHelper.GetPointForConnector(SourceConnectorInfo);
- SourceConnectorInfo.DataItem.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler;
+ SourceA = SourceConnectorInfo.Position;
+ if (SourceConnectorInfoFully != null)
+ {
+ SourceConnectorInfoFully.DataItem.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler;
+ }
+ //else if (SourceConnectorInfoPart != null)
+ //{
+ // SourceConnectorInfoPart.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler;
+ //}
}
break;
case nameof(SinkConnectorInfo):
if (SinkConnectorInfo != null)
{
SourceB = SinkConnectorInfo.Position;
- if (IsFullConnection)
+ if (SinkConnectorInfoFully != null)
{
SinkConnectorInfoFully.DataItem.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler;
}
+ //else if (SinkConnectorInfoPart != null)
+ //{
+ // SinkConnectorInfoPart.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler;
+ //}
}
break;
case nameof(IsSelected):
@@ -513,7 +556,7 @@ namespace AIStudio.Wpf.DiagramDesigner
if (e.PropertyName == nameof(ShapeViewModel.SourceMarker) ||
e.PropertyName == nameof(ShapeViewModel.SinkMarker))
{
- UpdatePathGeneratorResult();
+ UpdateArea();
}
}
else if (sender is DesignerItemViewModelBase)
@@ -527,12 +570,12 @@ namespace AIStudio.Wpf.DiagramDesigner
if (IsFullConnection)
{
//减少触发一次画线
- SourceA = PointHelper.GetPointForConnector(this.SourceConnectorInfo);
+ SourceA = PointHelper.GetPointForConnector(this.SourceConnectorInfoFully);
SourceB = PointHelper.GetPointForConnector(this.SinkConnectorInfoFully);
}
else
{
- SourceA = PointHelper.GetPointForConnector(this.SourceConnectorInfo);
+ SourceA = SourceConnectorInfo.MiddlePosition;
}
break;
}
@@ -570,6 +613,21 @@ namespace AIStudio.Wpf.DiagramDesigner
}
}
}
+ //else if (sender is PartCreatedConnectorInfo)
+ //{
+ // if (e.PropertyName == "Position")
+ // {
+ // if (sender == SourceConnectorInfoPart)
+ // {
+ // SourceA = SourceConnectorInfo.Position;
+ // }
+ // else if (sender == SinkConnectorInfoPart)
+ // {
+ // SourceB = SinkConnectorInfo.Position;
+ // }
+ // UpdatePathGeneratorResult();
+ // }
+ //}
else if (sender is ColorViewModel)
{
@@ -613,7 +671,7 @@ namespace AIStudio.Wpf.DiagramDesigner
StartAngle = PathGeneratorResult.SourceMarkerAngle;
EndAngle = PathGeneratorResult.TargetMarkerAngle;
- //StartPoint = new PointBase(source.Value.X - Area.Left - SourceConnectorInfo.ConnectorWidth / 2, source.Value.Y - Area.Top - SourceConnectorInfo.ConnectorHeight / 2) ;
+ //StartPoint = new PointBase(source.Value.X - Area.Left - SourceConnectorInfoFully.ConnectorWidth / 2, source.Value.Y - Area.Top - SourceConnectorInfoFully.ConnectorHeight / 2) ;
//EndPoint = new PointBase(target.Value.X - Area.Left - SinkConnectorInfo.ConnectorWidth / 2 , target.Value.Y - Area.Top - SinkConnectorInfo.ConnectorHeight / 2 );
StartPoint = new PointBase(source.Value.X - Area.Left , source.Value.Y - Area.Top );
@@ -650,6 +708,18 @@ namespace AIStudio.Wpf.DiagramDesigner
{
label.UpdatePosition(paths);
}
+
+ double marginwidth = 0;
+ double marginheight = 0;
+ if (Area.Width > SourceConnectorInfo.ConnectorWidth + SinkConnectorInfo.ConnectorWidth)
+ {
+ marginwidth = (SourceConnectorInfo.ConnectorWidth + SinkConnectorInfo.ConnectorWidth) / 2;
+ }
+ if (Area.Height > SourceConnectorInfo.ConnectorHeight + SinkConnectorInfo.ConnectorHeight)
+ {
+ marginheight = (SourceConnectorInfo.ConnectorHeight + SinkConnectorInfo.ConnectorHeight) / 2;
+ }
+ DragThumbMargin = new Thickness(marginwidth, marginheight, marginwidth, marginheight);
}
private void DeleteConnection(object args)
@@ -665,17 +735,17 @@ namespace AIStudio.Wpf.DiagramDesigner
{
if (IsPortless) // Portless
{
- if (SourceConnectorInfo.DataItem == null || (IsFullConnection && SinkConnectorInfoFully.DataItem == null))
+ if (SourceConnectorInfoFully?.DataItem == null || SinkConnectorInfoFully?.DataItem == null)
return (null, null);
- var sourceCenter = SourceConnectorInfo.IsPortless ? SourceConnectorInfo.DataItem.MiddlePosition : SourceConnectorInfo.MiddlePosition;
+ var sourceCenter = SourceConnectorInfoFully.IsPortless ? SourceConnectorInfoFully.DataItem.MiddlePosition : SourceConnectorInfoFully.MiddlePosition;
var targetCenter = SinkConnectorInfoFully?.IsPortless == true ? SinkConnectorInfoFully?.DataItem?.MiddlePosition ?? OnGoingPosition : SinkConnectorInfoFully?.MiddlePosition ?? OnGoingPosition;
var firstPt = route.Length > 0 ? route[0] : targetCenter;
var secondPt = route.Length > 0 ? route[0] : sourceCenter;
var sourceLine = new LineBase(firstPt, sourceCenter);
var targetLine = new LineBase(secondPt, targetCenter);
- var sourceIntersections = SourceConnectorInfo.DataItem.GetShape().GetIntersectionsWithLine(sourceLine);
- var targetIntersections = SinkConnectorInfoFully.DataItem.GetShape()?.GetIntersectionsWithLine(targetLine) ?? new PointBase[] { OnGoingPosition };
+ var sourceIntersections = SourceConnectorInfoFully.DataItem.GetShape().GetIntersectionsWithLine(sourceLine);
+ var targetIntersections = SinkConnectorInfoFully?.DataItem?.GetShape()?.GetIntersectionsWithLine(targetLine) ?? new PointBase[] { OnGoingPosition };
var sourceIntersection = GetClosestPointTo(sourceIntersections, firstPt);
var targetIntersection = GetClosestPointTo(targetIntersections, secondPt);
@@ -683,7 +753,7 @@ namespace AIStudio.Wpf.DiagramDesigner
}
else
{
- var source = SourceConnectorInfo.MiddlePosition;//GetPortPositionBasedOnAlignment(SourceConnectorInfo, ColorViewModel.LeftArrowSizeStyle);
+ var source = SourceConnectorInfo.MiddlePosition;//GetPortPositionBasedOnAlignment(SourceConnectorInfoFully, ColorViewModel.LeftArrowSizeStyle);
var target = SinkConnectorInfo.MiddlePosition;// GetPortPositionBasedOnAlignment(SinkConnectorInfoFully, ColorViewModel.RightArrowSizeStyle);
return (source, target);
}
@@ -749,6 +819,22 @@ namespace AIStudio.Wpf.DiagramDesigner
SinkConnectorInfo = port;
}
+ public void SetPartPostion(PointBase? sourcePoint, PointBase? sinkPoint)
+ {
+ if (sourcePoint != null)
+ {
+ SourceConnectorInfoPart.Position = sourcePoint.Value;
+ _sourceA = SourceConnectorInfoPart.Position;
+ }
+ if (sinkPoint != null)
+ {
+ SinkConnectorInfoPart.Position = sinkPoint.Value;
+ _sourceB = SinkConnectorInfoPart.Position;
+ }
+
+ UpdateArea();
+ }
+
public void UpdateConnectionMode(FullyCreatedConnectorInfo source, FullyCreatedConnectorInfo sink, string pathmode, string routermode)
{
//先置空,避免更新
diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/ConnectorInfoBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/ConnectorInfoBase.cs
index 3dff2aa..5a9e991 100644
--- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/ConnectorInfoBase.cs
+++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/ConnectorInfoBase.cs
@@ -65,7 +65,7 @@ namespace AIStudio.Wpf.DiagramDesigner
#region 属性
public virtual PointBase Position
{
- get;
+ get;set;
}
public virtual PointBase MiddlePosition
diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/PartCreatedConnectorInfo.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/PartCreatedConnectorInfo.cs
index f547590..fd9a82d 100644
--- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/PartCreatedConnectorInfo.cs
+++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/PartCreatedConnectorInfo.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows;
@@ -16,20 +17,23 @@ namespace AIStudio.Wpf.DiagramDesigner
public PartCreatedConnectorInfo(IDiagramViewModel root, double X, double Y) : base(root, ConnectorOrientation.None)
{
- this.position = new PointBase(X, Y);
+ this._position = new PointBase(X, Y);
}
- private PointBase position;
+ private PointBase _position;
public override PointBase Position
{
get
{
- return position;
+ return _position;
+ }
+ set
+ {
+
+ SetProperty(ref _position, value);
}
}
-
-
}
}
diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs
index ac7953b..6279e73 100644
--- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs
+++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs
@@ -1636,7 +1636,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{
if (!selectedConnections.Contains(connection))
{
- DesignerItemViewModelBase sourceItem = selectedDesignerItems.FirstOrDefault(p => p.Id == connection.SourceConnectorInfo.DataItem.Id);
+ DesignerItemViewModelBase sourceItem = selectedDesignerItems.FirstOrDefault(p => p.Id == connection.SourceConnectorInfoFully?.DataItem.Id);
DesignerItemViewModelBase sinkItem = selectedDesignerItems.FirstOrDefault(p => p.Id == connection.SinkConnectorInfoFully?.DataItem?.Id);
if (sourceItem != null && sinkItem != null && BelongToSameGroup(sourceItem, sinkItem))
{
diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/LogicalGateItemViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/LogicalGateItemViewModelBase.cs
index fd11fd8..88b329c 100644
--- a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/LogicalGateItemViewModelBase.cs
+++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/LogicalGateItemViewModelBase.cs
@@ -254,9 +254,9 @@ namespace AIStudio.Wpf.DiagramDesigner
continue;
}
- if (connector.SourceConnectorInfo.DataItem is LogicalGateItemViewModelBase sourceItem)
+ if (connector.SourceConnectorInfoFully?.DataItem is LogicalGateItemViewModelBase sourceItem)
{
- var output = (connector.SourceConnectorInfo as LogicalConnectorInfo);
+ var output = (connector.SourceConnectorInfoFully as LogicalConnectorInfo);
if (EnableInputValue(connector, input.Value, output))
{
@@ -266,14 +266,14 @@ namespace AIStudio.Wpf.DiagramDesigner
input.Value.ConnectorValue = output.ConnectorValue;
input.Value.ConnectorString = output.ConnectorString;
- input.Value.ColorViewModel.FillColor.Color = connector.SourceConnectorInfo.ColorViewModel.FillColor.Color;
+ input.Value.ColorViewModel.FillColor.Color = connector.SourceConnectorInfoFully.ColorViewModel.FillColor.Color;
if (LogicalType == LogicalType.Output)
{
- input.Value.ConnectorValueType = (connector.SourceConnectorInfo as LogicalConnectorInfo).ConnectorValueType;
+ input.Value.ConnectorValueType = (connector.SourceConnectorInfoFully as LogicalConnectorInfo).ConnectorValueType;
}
else if (LogicalType == LogicalType.NOT)
{
- input.Value.ConnectorValueType = ((connector.SourceConnectorInfo as LogicalConnectorInfo).ConnectorValueType == ConnectorValueType.Bool) ? ConnectorValueType.Bool : ConnectorValueType.Int;
+ input.Value.ConnectorValueType = ((connector.SourceConnectorInfoFully as LogicalConnectorInfo).ConnectorValueType == ConnectorValueType.Bool) ? ConnectorValueType.Bool : ConnectorValueType.Int;
}
sourceItem.ClearOutputValue(connector, output);
@@ -347,7 +347,7 @@ namespace AIStudio.Wpf.DiagramDesigner
protected ConnectionViewModel GetSinkItem(FullyCreatedConnectorInfo sourceConnector)
{
- return Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo == sourceConnector);
+ return Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully == sourceConnector);
}
}
}
diff --git a/Extensions/AIStudio.Wpf.Flowchart/FlowchartService.cs b/Extensions/AIStudio.Wpf.Flowchart/FlowchartService.cs
index 179875b..7d4ba8c 100644
--- a/Extensions/AIStudio.Wpf.Flowchart/FlowchartService.cs
+++ b/Extensions/AIStudio.Wpf.Flowchart/FlowchartService.cs
@@ -75,7 +75,7 @@ namespace AIStudio.Wpf.Flowchart
{
if (edge.IsFullConnection == false) continue;
- var source = oASteps.FirstOrDefault(p => p.BottomConnector == edge.SourceConnectorInfo || p.LeftConnector == edge.SourceConnectorInfo || p.RightConnector == edge.SourceConnectorInfo);
+ var source = oASteps.FirstOrDefault(p => p.BottomConnector == edge.SourceConnectorInfoFully || p.LeftConnector == edge.SourceConnectorInfoFully || p.RightConnector == edge.SourceConnectorInfoFully);
if (source != null)
{
if (source.Kind == NodeKinds.Decide)
diff --git a/Extensions/AIStudio.Wpf.Mind/Helpers/DirectoryLayout.cs b/Extensions/AIStudio.Wpf.Mind/Helpers/DirectoryLayout.cs
index 3c917f9..db49959 100644
--- a/Extensions/AIStudio.Wpf.Mind/Helpers/DirectoryLayout.cs
+++ b/Extensions/AIStudio.Wpf.Mind/Helpers/DirectoryLayout.cs
@@ -156,7 +156,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.FirstConnector);
connector?.SetSinkPort(child.TopConnector);
connector?.SetVisible(child.Visible);
@@ -181,7 +181,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.BottomConnector);
connector?.SetSinkPort(child.LeftConnector);
connector?.SetVisible(child.Visible);
diff --git a/Extensions/AIStudio.Wpf.Mind/Helpers/FishBoneLayout.cs b/Extensions/AIStudio.Wpf.Mind/Helpers/FishBoneLayout.cs
index 6df2642..9f97b20 100644
--- a/Extensions/AIStudio.Wpf.Mind/Helpers/FishBoneLayout.cs
+++ b/Extensions/AIStudio.Wpf.Mind/Helpers/FishBoneLayout.cs
@@ -195,7 +195,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.RightConnector);
connector?.SetSinkPort(child.BottomLeftConnector);
connector?.SetVisible(child.Visible);
@@ -219,7 +219,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.RightConnector);
connector?.SetSinkPort(child.TopLeftConnector);
connector?.SetVisible(child.Visible);
@@ -247,7 +247,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.BottomLeftConnector);
connector?.SetSinkPort(child.LeftConnector);
connector?.SetVisible(child.Visible);
@@ -271,7 +271,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.TopLeftConnector);
connector?.SetSinkPort(child.LeftConnector);
connector?.SetVisible(child.Visible);
@@ -297,7 +297,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.BottomConnector);
connector?.SetSinkPort(child.LeftConnector);
connector?.SetVisible(child.Visible);
@@ -320,7 +320,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.TopConnector);
connector?.SetSinkPort(child.LeftConnector);
connector?.SetVisible(child.Visible);
diff --git a/Extensions/AIStudio.Wpf.Mind/Helpers/LogicalLayout.cs b/Extensions/AIStudio.Wpf.Mind/Helpers/LogicalLayout.cs
index 96a1fb2..a49e70f 100644
--- a/Extensions/AIStudio.Wpf.Mind/Helpers/LogicalLayout.cs
+++ b/Extensions/AIStudio.Wpf.Mind/Helpers/LogicalLayout.cs
@@ -146,7 +146,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.RightConnector ?? mindNode.FirstConnector);
connector?.SetSinkPort(child.LeftConnector);
connector?.SetVisible(child.Visible);
diff --git a/Extensions/AIStudio.Wpf.Mind/Helpers/MindLayout.cs b/Extensions/AIStudio.Wpf.Mind/Helpers/MindLayout.cs
index c3c9bab..7e4f2f0 100644
--- a/Extensions/AIStudio.Wpf.Mind/Helpers/MindLayout.cs
+++ b/Extensions/AIStudio.Wpf.Mind/Helpers/MindLayout.cs
@@ -162,7 +162,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.FirstConnector);
connector?.SetSinkPort(child.LeftConnector);
connector?.SetVisible(child.Visible);
@@ -181,7 +181,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.FirstConnector);
connector?.SetSinkPort(child.RightConnector);
connector?.SetVisible(child.Visible);
@@ -208,7 +208,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.RightConnector);
connector?.SetSinkPort(child.LeftConnector);
connector?.SetVisible(child.Visible);
@@ -231,7 +231,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.LeftConnector);
connector?.SetSinkPort(child.RightConnector);
connector?.SetVisible(child.Visible);
diff --git a/Extensions/AIStudio.Wpf.Mind/Helpers/OrganizationalLayout.cs b/Extensions/AIStudio.Wpf.Mind/Helpers/OrganizationalLayout.cs
index 8b6e39e..f3c51e3 100644
--- a/Extensions/AIStudio.Wpf.Mind/Helpers/OrganizationalLayout.cs
+++ b/Extensions/AIStudio.Wpf.Mind/Helpers/OrganizationalLayout.cs
@@ -148,7 +148,7 @@ namespace AIStudio.Wpf.Mind.Helpers
ArrangeOverride(child);
- var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfo?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
+ var connector = mindNode.Root?.Items.OfType().FirstOrDefault(p => p.SourceConnectorInfoFully?.DataItem == mindNode && p.SinkConnectorInfoFully?.DataItem == child);
connector?.SetSourcePort(mindNode.BottomConnector);
connector?.SetSinkPort(child.TopConnector);
connector?.SetVisible(child.Visible);
diff --git a/Extensions/AIStudio.Wpf.Mind/ViewModels/MindNode.cs b/Extensions/AIStudio.Wpf.Mind/ViewModels/MindNode.cs
index 89e5493..187cf6c 100644
--- a/Extensions/AIStudio.Wpf.Mind/ViewModels/MindNode.cs
+++ b/Extensions/AIStudio.Wpf.Mind/ViewModels/MindNode.cs
@@ -111,7 +111,7 @@ namespace AIStudio.Wpf.Mind.ViewModels
var connector = Root?.Items.OfType().Where(p => p.IsFullConnection).FirstOrDefault(p => p.SinkConnectorInfoFully.DataItem == this);
if (connector != null)
{
- MindLayout?.GetOrSetConnectionViewModel(connector.SourceConnectorInfo.DataItem as MindNode, connector.SinkConnectorInfoFully.DataItem as MindNode, connector);
+ MindLayout?.GetOrSetConnectionViewModel(connector.SourceConnectorInfoFully.DataItem as MindNode, connector.SinkConnectorInfoFully.DataItem as MindNode, connector);
}
else if (ParentNode != null)
{
diff --git a/Extensions/AIStudio.Wpf.SFC/AIStudio.Wpf.SFC_h3vkg0gy_wpftmp.csproj b/Extensions/AIStudio.Wpf.SFC/AIStudio.Wpf.SFC_h3vkg0gy_wpftmp.csproj
new file mode 100644
index 0000000..e04fa4a
--- /dev/null
+++ b/Extensions/AIStudio.Wpf.SFC/AIStudio.Wpf.SFC_h3vkg0gy_wpftmp.csproj
@@ -0,0 +1,166 @@
+
+
+ AIStudio.Wpf.SFC
+ obj\Debug\
+ obj\
+ F:\aistudio.-wpf.-diagram\Extensions\AIStudio.Wpf.SFC\obj\
+ <_TargetAssemblyProjectName>AIStudio.Wpf.SFC
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Extensions/AIStudio.Wpf.SFC/AIStudio.Wpf.SFC_xalw2mo4_wpftmp.csproj b/Extensions/AIStudio.Wpf.SFC/AIStudio.Wpf.SFC_xalw2mo4_wpftmp.csproj
new file mode 100644
index 0000000..2ca4d1b
--- /dev/null
+++ b/Extensions/AIStudio.Wpf.SFC/AIStudio.Wpf.SFC_xalw2mo4_wpftmp.csproj
@@ -0,0 +1,233 @@
+
+
+ AIStudio.Wpf.SFC
+ obj\Debug\
+ obj\
+ F:\aistudio.-wpf.-diagram\Extensions\AIStudio.Wpf.SFC\obj\
+ <_TargetAssemblyProjectName>AIStudio.Wpf.SFC
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Extensions/AIStudio.Wpf.SFC/SFCService.cs b/Extensions/AIStudio.Wpf.SFC/SFCService.cs
index 8e44a39..217ad58 100644
--- a/Extensions/AIStudio.Wpf.SFC/SFCService.cs
+++ b/Extensions/AIStudio.Wpf.SFC/SFCService.cs
@@ -51,7 +51,7 @@ namespace AIStudio.Wpf.SFC
{
if (edge.IsFullConnection == false) continue;
- var source = nodes.FirstOrDefault(p => p == edge.SourceConnectorInfo.DataItem);
+ var source = nodes.FirstOrDefault(p => p == edge.SourceConnectorInfoFully.DataItem);
if (source != null)
{
source.NextNode.Add(edge.SinkConnectorInfoFully.DataItem as SFCNode);