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);