Files
aistudio-wpf-diagram/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModelHelper.cs

150 lines
5.6 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
2023-02-10 18:49:02 +08:00
using AIStudio.Wpf.DiagramDesigner.Geometrys;
namespace AIStudio.Wpf.DiagramDesigner
{
2023-06-28 12:06:58 +08:00
public static partial class DiagramViewModelHelper
{
2023-06-28 12:06:58 +08:00
static List<IAttachTo> AttachTos
{
get; set;
} = new List<IAttachTo>();
public static DesignerItemViewModelBase GetConnectorDataItem(IEnumerable<SelectableDesignerItemViewModelBase> items, Guid conectorDataItemId, Type connectorDataItemType)
{
DesignerItemViewModelBase dataItem = items.OfType<DesignerItemViewModelBase>().Single(x => x.Id == conectorDataItemId);
return dataItem;
}
2023-02-10 18:49:02 +08:00
public static RectangleBase GetBoundingRectangle(IEnumerable<DesignerItemViewModelBase> items)
{
double x1 = Double.MaxValue;
double y1 = Double.MaxValue;
double x2 = Double.MinValue;
double y2 = Double.MinValue;
foreach (DesignerItemViewModelBase item in items)
{
x1 = Math.Min(item.Left, x1);
y1 = Math.Min(item.Top, y1);
x2 = Math.Max(item.Left + item.GetItemWidth(), x2);
y2 = Math.Max(item.Top + item.GetItemHeight(), y2);
2023-02-10 18:49:02 +08:00
}
return new RectangleBase(new PointBase(x1, y1), new PointBase(x2, y2));
}
2023-03-19 23:26:14 +08:00
public static RectangleBase GetBoundingRectangle(DesignerItemViewModelBase item)
{
return GetBoundingRectangle(new DesignerItemViewModelBase[] { item });
}
2023-06-19 15:47:39 +08:00
#region
public static FullyCreatedConnectorInfo FindNearPortToAttachTo(this IDiagramViewModel diagramViewModel, ConnectionViewModel partialConnection, ConnectorVertexType connectorVertexType)
{
if (partialConnection == null)
return null;
2023-06-28 12:06:58 +08:00
diagramViewModel.ClearAttachTo();
2023-06-19 15:47:39 +08:00
foreach (var port in diagramViewModel.Items.OfType<DesignerItemViewModelBase>().ToList().SelectMany(n => n.Connectors))
{
if (connectorVertexType == ConnectorVertexType.Start)
{
if (partialConnection.SourceConnectorInfo.Position.DistanceTo(port.Position) < diagramViewModel.DiagramOption.SnappingOption.SnappingRadius)
{
if (partialConnection.SinkConnectorInfo?.CanAttachTo(port) == true)
{
port.DataItem.ShowConnectors = true;
2023-06-28 12:06:58 +08:00
diagramViewModel.AddAttachTo(port, true);
2023-06-19 15:47:39 +08:00
return port;
}
else
{
port.DataItem.ShowConnectors = true;
2023-06-28 12:06:58 +08:00
diagramViewModel.AddAttachTo(port, false);
2023-06-19 15:47:39 +08:00
return null;
}
}
}
else if (connectorVertexType == ConnectorVertexType.End)
{
if (partialConnection.SinkConnectorInfo.Position.DistanceTo(port.Position) < diagramViewModel.DiagramOption.SnappingOption.SnappingRadius)
{
if (partialConnection.SourceConnectorInfo?.CanAttachTo(port) == true)
{
port.DataItem.ShowConnectors = true;
2023-06-28 12:06:58 +08:00
diagramViewModel.AddAttachTo(port, true);
2023-06-19 15:47:39 +08:00
return port;
}
else
{
port.DataItem.ShowConnectors = true;
2023-06-28 12:06:58 +08:00
diagramViewModel.AddAttachTo(port, false);
2023-06-19 15:47:39 +08:00
return null;
}
}
}
}
return null;
}
public static FullyCreatedConnectorInfo FindNearPortToAttachTo(this IDiagramViewModel diagramViewModel, ConnectionViewModel partialConnection)
{
if (partialConnection == null)
return null;
2023-06-28 12:06:58 +08:00
diagramViewModel.ClearAttachTo();
2023-06-19 15:47:39 +08:00
foreach (var port in diagramViewModel.Items.OfType<DesignerItemViewModelBase>().ToList().SelectMany(n => n.Connectors))
{
if (partialConnection.OnGoingPosition.DistanceTo(port.Position) < diagramViewModel.DiagramOption.SnappingOption.SnappingRadius)
{
port.DataItem.ShowConnectors = true;
if (partialConnection.SourceConnectorInfo?.CanAttachTo(port) == true)
{
2023-06-28 12:06:58 +08:00
diagramViewModel.AddAttachTo(port, true);
2023-06-19 15:47:39 +08:00
return port;
}
else
{
2023-06-28 12:06:58 +08:00
diagramViewModel.AddAttachTo(port, false);
2023-06-19 15:47:39 +08:00
return null;
}
}
2023-06-28 12:06:58 +08:00
}
2023-06-19 15:47:39 +08:00
return null;
}
2023-06-28 12:06:58 +08:00
public static void AddAttachTo(this IDiagramViewModel diagramViewModel, IAttachTo item, bool beAttachTo)
2023-06-19 15:47:39 +08:00
{
2023-06-28 12:06:58 +08:00
if (beAttachTo)
{
item.BeAttachTo = true;
}
else
{
item.DisableAttachTo = true;
}
AttachTos.Add(item);
}
public static void ClearAttachTo(this IDiagramViewModel diagramViewModel)
{
AttachTos.ForEach(p => {
p.DisableAttachTo = false;
p.BeAttachTo = false;
});
AttachTos.Clear();
2023-06-19 15:47:39 +08:00
}
#endregion
2023-06-28 12:06:58 +08:00
}
}