diff --git a/AIStudio.Wpf.ADiagram/ViewModels/DiagramsViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/DiagramsViewModel.cs index 62980cd..bf77e80 100644 --- a/AIStudio.Wpf.ADiagram/ViewModels/DiagramsViewModel.cs +++ b/AIStudio.Wpf.ADiagram/ViewModels/DiagramsViewModel.cs @@ -22,7 +22,7 @@ namespace AIStudio.Wpf.ADiagram.ViewModels { public partial class DiagramsViewModel : BindableBase { - private IDiagramServiceProvider _service { get { return DiagramServicesProvider.Instance.Provider; } } + protected IDiagramServiceProvider _service { get { return DiagramServicesProvider.Instance.Provider; } } public DiagramsViewModel(string title, string status, DiagramType diagramType) { @@ -246,7 +246,7 @@ namespace AIStudio.Wpf.ADiagram.ViewModels } } - private void OpenFile(DiagramDocument diagramDocument) + protected virtual void OpenFile(DiagramDocument diagramDocument) { Title = diagramDocument.Title; DiagramType = diagramDocument.DiagramType; diff --git a/AIStudio.Wpf.ADiagram/ViewModels/FlowchartViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/FlowchartViewModel.cs index 60df0ba..946eff9 100644 --- a/AIStudio.Wpf.ADiagram/ViewModels/FlowchartViewModel.cs +++ b/AIStudio.Wpf.ADiagram/ViewModels/FlowchartViewModel.cs @@ -17,7 +17,7 @@ namespace AIStudio.Wpf.Flowchart { public FlowchartViewModel(string title, string status, DiagramType diagramType) : base(title, status, diagramType) { - + _service.DrawModeViewModel.VectorLineDrawMode = DrawMode.BoundaryConnectingLine; } public FlowchartViewModel(string filename, DiagramDocument diagramDocument) : base(filename, diagramDocument) { @@ -27,6 +27,12 @@ namespace AIStudio.Wpf.Flowchart } } + protected override void OpenFile(DiagramDocument diagramDocument) + { + _service.DrawModeViewModel.VectorLineDrawMode = DrawMode.BoundaryConnectingLine; + base.OpenFile(diagramDocument); + } + protected override void InitDiagramViewModel() { base.InitDiagramViewModel(); diff --git a/AIStudio.Wpf.ADiagram/ViewModels/LogicalViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/LogicalViewModel.cs index 69f3e96..88c3fa0 100644 --- a/AIStudio.Wpf.ADiagram/ViewModels/LogicalViewModel.cs +++ b/AIStudio.Wpf.ADiagram/ViewModels/LogicalViewModel.cs @@ -13,13 +13,19 @@ namespace AIStudio.Wpf.Logical { public LogicalViewModel(string title, string status, DiagramType diagramType) : base(title, status, diagramType) { - + _service.DrawModeViewModel.VectorLineDrawMode = DrawMode.CornerConnectingLine; } public LogicalViewModel(string filename, DiagramDocument diagramDocument) : base(filename, diagramDocument) { } + protected override void OpenFile(DiagramDocument diagramDocument) + { + _service.DrawModeViewModel.VectorLineDrawMode = DrawMode.CornerConnectingLine; + base.OpenFile(diagramDocument); + } + protected override void InitDiagramViewModel() { base.InitDiagramViewModel(); diff --git a/AIStudio.Wpf.ADiagram/ViewModels/SFCViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/SFCViewModel.cs index dc8cf86..6f5e900 100644 --- a/AIStudio.Wpf.ADiagram/ViewModels/SFCViewModel.cs +++ b/AIStudio.Wpf.ADiagram/ViewModels/SFCViewModel.cs @@ -20,7 +20,7 @@ namespace AIStudio.Wpf.Flowchart { public SFCViewModel(string title, string status, DiagramType diagramType) : base(title, status, diagramType) { - + _service.DrawModeViewModel.VectorLineDrawMode = DrawMode.BoundaryConnectingLine; } public SFCViewModel(string filename, DiagramDocument diagramDocument) : base(filename, diagramDocument) { @@ -34,6 +34,12 @@ namespace AIStudio.Wpf.Flowchart readDataTimer.Start(); } + protected override void OpenFile(DiagramDocument diagramDocument) + { + _service.DrawModeViewModel.VectorLineDrawMode = DrawMode.BoundaryConnectingLine; + base.OpenFile(diagramDocument); + } + protected override void InitDiagramViewModel() { base.InitDiagramViewModel(); diff --git a/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml b/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml index 3b4b94e..694bf61 100644 --- a/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml +++ b/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml @@ -801,33 +801,41 @@ - + + + + + - + + + + @@ -816,7 +853,7 @@ - + diff --git a/Util.DiagramDesigner/UserControls/PointContainer.xaml b/Util.DiagramDesigner/UserControls/PointContainer.xaml new file mode 100644 index 0000000..d1b2b79 --- /dev/null +++ b/Util.DiagramDesigner/UserControls/PointContainer.xaml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/Util.DiagramDesigner/UserControls/PointContainer.xaml.cs b/Util.DiagramDesigner/UserControls/PointContainer.xaml.cs new file mode 100644 index 0000000..0b506d1 --- /dev/null +++ b/Util.DiagramDesigner/UserControls/PointContainer.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Util.DiagramDesigner +{ + /// + /// PointContainer.xaml 的交互逻辑 + /// + public partial class PointContainer : ItemsControl + { + public PointContainer() + { + InitializeComponent(); + } + } +} diff --git a/Util.DiagramDesigner/ViewModels/AdditionViewModel/DrawModeViewModel.cs b/Util.DiagramDesigner/ViewModels/AdditionViewModel/DrawModeViewModel.cs index c7ea0c5..db91645 100644 --- a/Util.DiagramDesigner/ViewModels/AdditionViewModel/DrawModeViewModel.cs +++ b/Util.DiagramDesigner/ViewModels/AdditionViewModel/DrawModeViewModel.cs @@ -27,6 +27,7 @@ namespace Util.DiagramDesigner return DrawMode.Normal; } + public void ResetDrawMode() { CursorDrawModeSelected = true; @@ -104,7 +105,7 @@ namespace Util.DiagramDesigner } } - private DrawMode _vectorLineDrawMode = DrawMode.ConnectingLine; + private DrawMode _vectorLineDrawMode = DrawMode.RadiusConnectingLine; public DrawMode VectorLineDrawMode { get diff --git a/Util.DiagramDesigner/ViewModels/AdditionViewModel/IDrawModeViewModel.cs b/Util.DiagramDesigner/ViewModels/AdditionViewModel/IDrawModeViewModel.cs index 1010a29..0473e3e 100644 --- a/Util.DiagramDesigner/ViewModels/AdditionViewModel/IDrawModeViewModel.cs +++ b/Util.DiagramDesigner/ViewModels/AdditionViewModel/IDrawModeViewModel.cs @@ -12,5 +12,6 @@ namespace Util.DiagramDesigner void ResetDrawMode(); CursorMode CursorMode { get; set; } + DrawMode VectorLineDrawMode { get; set; } } } diff --git a/Util.DiagramDesigner/ViewModels/BaseViewModel/DesignerItemViewModelBase.cs b/Util.DiagramDesigner/ViewModels/BaseViewModel/DesignerItemViewModelBase.cs index 0e8b0a0..6cb5636 100644 --- a/Util.DiagramDesigner/ViewModels/BaseViewModel/DesignerItemViewModelBase.cs +++ b/Util.DiagramDesigner/ViewModels/BaseViewModel/DesignerItemViewModelBase.cs @@ -271,7 +271,7 @@ namespace Util.DiagramDesigner /// /// 连接点是否可以按偏移自定义 /// - public bool IsRatioConnector { get; set; } + public bool IsInnerConnector { get; set; } private ObservableCollection connectors = new ObservableCollection(); public IEnumerable Connectors { get { return connectors; } } diff --git a/Util.DiagramDesigner/ViewModels/BaseViewModel/PointInfoBase.cs b/Util.DiagramDesigner/ViewModels/BaseViewModel/PointInfoBase.cs new file mode 100644 index 0000000..9916610 --- /dev/null +++ b/Util.DiagramDesigner/ViewModels/BaseViewModel/PointInfoBase.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Media; + +namespace Util.DiagramDesigner +{ + public class PointInfoBase : BindableBase + { + public PointInfoBase() + { + ColorViewModel = new ColorViewModel() + { + LineColor = new ColorObject() { Color = Color.FromArgb(0xAA, 0x00, 0x00, 0x80) }, + FillColor = new ColorObject() { Color = Colors.Lavender }, + }; + } + + public PointInfoBase(Point point) : this() + { + X = point.X; + Y = point.Y; + } + + + private double _x; + public double X + { + get + { + return _x; + } + set + { + if(SetProperty(ref _x, value)) + { + RaisePropertyChanged(nameof(Left)); + } + } + } + + private double _y; + public double Y + { + get + { + return _y; + } + set + { + if (SetProperty(ref _y, value)) + { + RaisePropertyChanged(nameof(Top)); + } + } + } + + public double Left + { + get + { + return X - ConnectorWidth / 2; + } + } + + public double Top + { + get + { + return Y - ConnectorHeight / 2; + } + } + + private double connectorWidth = 8; + public double ConnectorWidth + { + get { return connectorWidth; } + set { connectorWidth = value; } + } + + private double connectorHeight = 8; + public double ConnectorHeight + { + get { return connectorHeight; } + set { connectorHeight = value; } + } + + private IColorViewModel _colorViewModel; + public IColorViewModel ColorViewModel + { + get + { + return _colorViewModel; + } + set + { + SetProperty(ref _colorViewModel, value); + } + } + + public static implicit operator PointInfoBase(Point point) + { + return new PointInfoBase(point); + } + + public static implicit operator Point(PointInfoBase pointInfoBase) + { + return new Point(pointInfoBase.X, pointInfoBase.Y); + } + + public static List ToList(List lst) + { + return lst.Select(p => (PointInfoBase)p).ToList(); + } + } +} diff --git a/Util.DiagramDesigner/ViewModels/ConnectorViewModel.cs b/Util.DiagramDesigner/ViewModels/ConnectorViewModel.cs index 92ff273..acc0b30 100644 --- a/Util.DiagramDesigner/ViewModels/ConnectorViewModel.cs +++ b/Util.DiagramDesigner/ViewModels/ConnectorViewModel.cs @@ -10,6 +10,8 @@ namespace Util.DiagramDesigner { public class ConnectorViewModel : SelectableDesignerItemViewModelBase { + private IDiagramServiceProvider _service { get { return DiagramServicesProvider.Instance.Provider; } } + public ConnectorViewModel(IDiagramViewModel parent, FullyCreatedConnectorInfo sourceConnectorInfo, FullyCreatedConnectorInfo sinkConnectorInfo, SelectableDesignerItemBase designer) : base(parent, designer) { @@ -61,8 +63,8 @@ namespace Util.DiagramDesigner } } - private List _connectionPoints; - public List ConnectionPoints + private List _connectionPoints; + public List ConnectionPoints { get { @@ -70,7 +72,15 @@ namespace Util.DiagramDesigner } private set { + if (_connectionPoints != null) + { + _connectionPoints.ForEach(p => p.PropertyChanged -= new WeakINPCEventHandler(ConnectionPoint_PropertyChanged).Handler); + } SetProperty(ref _connectionPoints, value); + if (_connectionPoints != null) + { + _connectionPoints.ForEach(p => p.PropertyChanged += new WeakINPCEventHandler(ConnectionPoint_PropertyChanged).Handler); + } } } @@ -179,35 +189,36 @@ namespace Util.DiagramDesigner private void UpdateConnectionPoints() { - if (SinkConnectorInfo is FullyCreatedConnectorInfo && SourceConnectorInfo.DataItem is LinkPointDesignerItemViewModel && ((FullyCreatedConnectorInfo)SinkConnectorInfo).DataItem is LinkPointDesignerItemViewModel) + if (_service.DrawModeViewModel.VectorLineDrawMode == DrawMode.ConnectingLine) { UpdateConnectionPointsByLine(); - return; } - if (Parent.DiagramType == DiagramType.FlowChart || Parent.DiagramType == DiagramType.SFC) + else if (_service.DrawModeViewModel.VectorLineDrawMode == DrawMode.BoundaryConnectingLine) { - UpdateConnectionPointsByFlowChart(); + UpdateConnectionPointsByBoundary(); } else { - UpdateConnectionPointsByNormal(); + UpdateConnectionPointsByCorner(); } } private void UpdateConnectionPointsByLine() { - ConnectionPoints = new List() + ConnectionPoints = PointInfoBase.ToList(new List() { new Point(SourceA.X < SourceB.X ? 0d : Area.Width, SourceA.Y < SourceB.Y ? 0d : Area.Height ), new Point(SourceA.X > SourceB.X ? 0d : Area.Width, SourceA.Y > SourceB.Y ? 0d : Area.Height) - }; + }); + StartPoint = ConnectionPoints[0]; + EndPoint = ConnectionPoints.Last(); } - private void UpdateConnectionPointsByNormal() + private void UpdateConnectionPointsByCorner() { - ConnectionPoints = new List() + var points = new List() { new Point(SourceA.X < SourceB.X ? 0d : Area.Width, SourceA.Y < SourceB.Y ? 0d : Area.Height ), @@ -215,34 +226,34 @@ namespace Util.DiagramDesigner }; ConnectorInfo sourceInfo = ConnectorInfo(SourceConnectorInfo.Orientation, - ConnectionPoints[0].X, - ConnectionPoints[0].Y, + points[0].X, + points[0].Y, SourceConnectorInfo.DataItem.ItemWidth, SourceConnectorInfo.DataItem.ItemHeight, - ConnectionPoints[0]); + points[0]); - StartPoint = ConnectionPoints[0]; + StartPoint = points[0]; if (IsFullConnection) { - EndPoint = ConnectionPoints.Last(); + EndPoint = points.Last(); ConnectorInfo sinkInfo = ConnectorInfo(SinkConnectorInfo.Orientation, - ConnectionPoints[1].X, - ConnectionPoints[1].Y, + points[1].X, + points[1].Y, ((FullyCreatedConnectorInfo)_sinkConnectorInfo).DataItem.ItemWidth, ((FullyCreatedConnectorInfo)_sinkConnectorInfo).DataItem.ItemHeight, - ConnectionPoints[1]); + points[1]); - ConnectionPoints = PathFinder.GetConnectionLine(sourceInfo, sinkInfo, false, SourceConnectorInfo.IsInnerPoint); + ConnectionPoints = PointInfoBase.ToList(PathFinder.GetConnectionLine(sourceInfo, sinkInfo, false, SourceConnectorInfo.IsInnerPoint)); } else { - ConnectionPoints = PathFinder.GetConnectionLine(sourceInfo, ConnectionPoints[1], SourceConnectorInfo.Orientation, SourceConnectorInfo.IsInnerPoint); + ConnectionPoints = PointInfoBase.ToList(PathFinder.GetConnectionLine(sourceInfo, points[1], SourceConnectorInfo.Orientation, SourceConnectorInfo.IsInnerPoint)); EndPoint = new Point(); } } #region - private void UpdateConnectionPointsByFlowChart() + private void UpdateConnectionPointsByBoundary() { var points = new List(); var ends = GetEndPoinds(); @@ -253,7 +264,7 @@ namespace Util.DiagramDesigner var res = points.ToArray(); //UpdateEdges(res); DoShift(res); - ConnectionPoints = res.ToList(); + ConnectionPoints = PointInfoBase.ToList(res.ToList()); StartPoint = ConnectionPoints[0]; EndPoint = ConnectionPoints.Last(); } @@ -372,6 +383,18 @@ namespace Util.DiagramDesigner } } + private void ConnectionPoint_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + switch (e.PropertyName) + { + case "Left": + case "Top": + RaisePropertyChanged(nameof(ConnectionPoints)); + break; + + } + } + private void Init(FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo) { this.Parent = sourceConnectorInfo.DataItem.Parent;