diff --git a/AIStudio.Wpf.DiagramDesigner/AIStudio.Wpf.DiagramDesigner_cqtxzinf_wpftmp.csproj b/AIStudio.Wpf.DiagramDesigner/AIStudio.Wpf.DiagramDesigner_cqtxzinf_wpftmp.csproj new file mode 100644 index 0000000..89b49b2 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner/AIStudio.Wpf.DiagramDesigner_cqtxzinf_wpftmp.csproj @@ -0,0 +1,267 @@ + + + AIStudio.Wpf.DiagramDesigner + obj\Debug\ + obj\ + F:\aistudio.-wpf.-diagram\AIStudio.Wpf.DiagramDesigner\obj\ + <_TargetAssemblyProjectName>AIStudio.Wpf.DiagramDesigner + + + + true + AIStudio.Wpf.Controls + akwkevin + https://gitee.com/akwkevin + A.png + + + 1.0.5 + 一个Wpf的Diagram控件基础库 + + + + + + True + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AIStudio.Wpf.DiagramDesigner/Helpers/PointHelper.cs b/AIStudio.Wpf.DiagramDesigner/Helpers/PointHelper.cs index b05eb20..a104f9e 100644 --- a/AIStudio.Wpf.DiagramDesigner/Helpers/PointHelper.cs +++ b/AIStudio.Wpf.DiagramDesigner/Helpers/PointHelper.cs @@ -1,13 +1,14 @@ -using AIStudio.Wpf.DiagramDesigner.Geometrys; +using System; +using AIStudio.Wpf.DiagramDesigner.Geometrys; namespace AIStudio.Wpf.DiagramDesigner { public class PointHelper { - public static PointBase GetPointForConnector(FullyCreatedConnectorInfo connector) + public static PointBase GetPointForConnector(FullyCreatedConnectorInfo connector, bool middle = false) { PointBase point = new PointBase(); - if (connector == null) + if (connector == null || connector.DataItem == null) { return point; } @@ -19,7 +20,7 @@ namespace AIStudio.Wpf.DiagramDesigner } else if (connector.IsPortless) { - point = connector.DataItem?.GetBounds().Center?? connector.MiddlePosition; + point = connector.DataItem.MiddlePosition; } else { @@ -54,7 +55,20 @@ namespace AIStudio.Wpf.DiagramDesigner break; } } - return point; + + if (middle) + { + point.X = point.X + connector.ConnectorWidth / 2; + point.Y = point.Y + connector.ConnectorHeight / 2; + } + //旋转后的坐标 + var newX = (point.X - connector.DataItem.MiddlePosition.X) * Math.Cos(connector.DataItem.Angle * Math.PI / 180) - (point.Y - connector.DataItem.MiddlePosition.Y) * Math.Sin(connector.DataItem.Angle * Math.PI / 180) + connector.DataItem.MiddlePosition.X; + var newY = (point.Y - connector.DataItem.MiddlePosition.Y) * Math.Cos(connector.DataItem.Angle * Math.PI / 180) - (point.X - connector.DataItem.MiddlePosition.X) * Math.Sin(connector.DataItem.Angle * Math.PI / 180) + connector.DataItem.MiddlePosition.Y; + //放大缩小后的坐标 + + newX = (newX - connector.DataItem.MiddlePosition.X) * connector.DataItem.ScaleX + connector.DataItem.MiddlePosition.X; + newY = (newY - connector.DataItem.MiddlePosition.Y) * connector.DataItem.ScaleY + connector.DataItem.MiddlePosition.Y; + return new PointBase(newX, newY); } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs index 118109a..59f0fce 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs @@ -548,15 +548,15 @@ namespace AIStudio.Wpf.DiagramDesigner var startMiddle = new RectangleBase ( - Math.Abs((PathGeneratorResult.SourceMarkerPosition.X + (source.Value.X - Area.Left)) / 2), - Math.Abs((PathGeneratorResult.SourceMarkerPosition.Y + (source.Value.Y - Area.Top)) / 2), + (PathGeneratorResult.SourceMarkerPosition.X + (source.Value.X - Area.Left)) / 2, + (PathGeneratorResult.SourceMarkerPosition.Y + (source.Value.Y - Area.Top)) / 2, 0, 0 ); var endMiddle = new RectangleBase ( - Math.Abs((PathGeneratorResult.TargetMarkerPosition.X + (target.Value.X - Area.Left)) / 2), - Math.Abs((PathGeneratorResult.TargetMarkerPosition.Y + (target.Value.Y - Area.Top)) / 2), + (PathGeneratorResult.TargetMarkerPosition.X + (target.Value.X - Area.Left)) / 2, + (PathGeneratorResult.TargetMarkerPosition.Y + (target.Value.Y - Area.Top)) / 2, 0, 0 ); @@ -589,8 +589,8 @@ namespace AIStudio.Wpf.DiagramDesigner if (SourceConnectorInfo.DataItem == null || (IsFullConnection && SinkConnectorInfoFully.DataItem == null)) return (null, null); - var sourceCenter = SourceConnectorInfo.IsPortless ? SourceConnectorInfo.DataItem.GetBounds().Center : SourceConnectorInfo.MiddlePosition; - var targetCenter = SinkConnectorInfoFully?.IsPortless == true ? SinkConnectorInfoFully?.DataItem?.GetBounds().Center ?? OnGoingPosition : SinkConnectorInfoFully?.MiddlePosition ?? OnGoingPosition; + var sourceCenter = SourceConnectorInfo.IsPortless ? SourceConnectorInfo.DataItem.MiddlePosition : SourceConnectorInfo.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); diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/FullyCreatedConnectorInfo.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/FullyCreatedConnectorInfo.cs index 1c41c82..3ccb3ff 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/FullyCreatedConnectorInfo.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/FullyCreatedConnectorInfo.cs @@ -83,6 +83,14 @@ namespace AIStudio.Wpf.DiagramDesigner } } + public override PointBase MiddlePosition + { + get + { + return PointHelper.GetPointForConnector(this, true); + } + } + private List menuOptions; public IEnumerable MenuOptions { diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DesignerItemViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DesignerItemViewModelBase.cs index b40dac6..9c29184 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DesignerItemViewModelBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DesignerItemViewModelBase.cs @@ -157,6 +157,14 @@ namespace AIStudio.Wpf.DiagramDesigner get; } + public virtual PointBase MiddlePosition + { + get + { + return GetBounds().Center; + } + } + private string _icon; [CanDo] public string Icon