diff --git a/AIStudio.Wpf.ADiagram/Models/PathToolBoxData.cs b/AIStudio.Wpf.ADiagram/Models/PathToolBoxData.cs index d298da2..d93faa1 100644 --- a/AIStudio.Wpf.ADiagram/Models/PathToolBoxData.cs +++ b/AIStudio.Wpf.ADiagram/Models/PathToolBoxData.cs @@ -59,7 +59,7 @@ namespace AIStudio.Wpf.ADiagram.Models public SFCToolBoxData(SFCNodeKinds kind, Type type, double width = 32, double height = 32) : base(null, null, type, width, height) { Kind = kind; - ColorViewModel.LineColor.Color = Colors.Black; + ColorViewModel.LineColor.Color = Colors.Gray; ColorViewModel.FillColor.Color = Colors.Blue; } diff --git a/AIStudio.Wpf.ADiagram/ViewModels/DiagramsViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/DiagramsViewModel.cs index bf77e80..1104e34 100644 --- a/AIStudio.Wpf.ADiagram/ViewModels/DiagramsViewModel.cs +++ b/AIStudio.Wpf.ADiagram/ViewModels/DiagramsViewModel.cs @@ -287,7 +287,7 @@ namespace AIStudio.Wpf.ADiagram.ViewModels ConnectorOrientation sinkConnectorOrientation = connection.SinkOrientation; FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connection.Id, sinkItem, sinkConnectorOrientation, connection.SinkXRatio, connection.SinkYRatio, connection.SinkInnerPoint); - ConnectorViewModel connectionVM = new ConnectorViewModel(viewModel, sourceConnectorInfo, sinkConnectorInfo, connection); + ConnectorViewModel connectionVM = new ConnectorViewModel(viewModel, sourceConnectorInfo, sinkConnectorInfo, connection, connection.VectorLineDrawMode); viewModel.Items.Add(connectionVM); } @@ -445,7 +445,7 @@ namespace AIStudio.Wpf.ADiagram.ViewModels ConnectorOrientation sinkConnectorOrientation = connection.SinkOrientation; FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connection.Id, sinkItem, sinkConnectorOrientation, connection.SinkXRatio, connection.SinkYRatio, connection.SinkInnerPoint); - ConnectorViewModel connectionVM = new ConnectorViewModel(DiagramViewModel, sourceConnectorInfo, sinkConnectorInfo, connection); + ConnectorViewModel connectionVM = new ConnectorViewModel(DiagramViewModel, sourceConnectorInfo, sinkConnectorInfo, connection, connection.VectorLineDrawMode); items.Add(connectionVM); } @@ -989,7 +989,7 @@ namespace AIStudio.Wpf.ADiagram.ViewModels ConnectorOrientation sinkConnectorOrientation = connection.SinkOrientation; FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connection.Id, sinkItem, sinkConnectorOrientation, connection.SinkXRatio, connection.SinkYRatio, connection.SinkInnerPoint); - ConnectorViewModel connectionVM = new ConnectorViewModel(viewModel, sourceConnectorInfo, sinkConnectorInfo, connection); + ConnectorViewModel connectionVM = new ConnectorViewModel(viewModel, sourceConnectorInfo, sinkConnectorInfo, connection, connection.VectorLineDrawMode); viewModel.Items.Add(connectionVM); } diff --git a/AIStudio.Wpf.ADiagram/ViewModels/FlowchartViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/FlowchartViewModel.cs index 946eff9..fe77904 100644 --- a/AIStudio.Wpf.ADiagram/ViewModels/FlowchartViewModel.cs +++ b/AIStudio.Wpf.ADiagram/ViewModels/FlowchartViewModel.cs @@ -17,20 +17,15 @@ 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) - { + { if (DiagramViewModel != null) { FlowchartService.InitData(DiagramViewModel.Items.OfType().ToList(), DiagramViewModel.Items.OfType().ToList(), DiagramViewModel); } - } - - protected override void OpenFile(DiagramDocument diagramDocument) - { _service.DrawModeViewModel.VectorLineDrawMode = DrawMode.BoundaryConnectingLine; - base.OpenFile(diagramDocument); } protected override void InitDiagramViewModel() @@ -41,6 +36,7 @@ namespace AIStudio.Wpf.Flowchart DiagramViewModel.GridCellSize = new Size(100, 100); DiagramViewModel.CellHorizontalAlignment = CellHorizontalAlignment.Center; DiagramViewModel.CellVerticalAlignment = CellVerticalAlignment.Center; + _service.DrawModeViewModel.VectorLineDrawMode = DrawMode.BoundaryConnectingLine; } protected override void Init() @@ -74,36 +70,36 @@ namespace AIStudio.Wpf.Flowchart DesignerItemViewModelBase end = new EndFlowNode() { Left = 100, Top = 700, Color = Colors.Yellow.ToString() }; DiagramViewModel.DirectAddItemCommand.Execute(end); - ConnectorViewModel connector1 = new ConnectorViewModel(start.BottomConnector, middle1.TopConnector); + ConnectorViewModel connector1 = new ConnectorViewModel(start.BottomConnector, middle1.TopConnector, _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector1); - ConnectorViewModel connector2 = new ConnectorViewModel(middle1.BottomConnector, decide.TopConnector); + ConnectorViewModel connector2 = new ConnectorViewModel(middle1.BottomConnector, decide.TopConnector, _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector2); - ConnectorViewModel connector3 = new ConnectorViewModel(decide.RightConnector, middle2.TopConnector); + ConnectorViewModel connector3 = new ConnectorViewModel(decide.RightConnector, middle2.TopConnector, _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector3); connector3.AddText(">=3"); - ConnectorViewModel connector4 = new ConnectorViewModel(middle2.BottomConnector, cobegin.TopConnector); + ConnectorViewModel connector4 = new ConnectorViewModel(middle2.BottomConnector, cobegin.TopConnector, _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector4); - ConnectorViewModel connector5 = new ConnectorViewModel(decide.BottomConnector, cobegin.TopConnector); + ConnectorViewModel connector5 = new ConnectorViewModel(decide.BottomConnector, cobegin.TopConnector, _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector5); connector5.AddText("<3"); - ConnectorViewModel connector6 = new ConnectorViewModel(cobegin.BottomConnector, middle3.TopConnector); + ConnectorViewModel connector6 = new ConnectorViewModel(cobegin.BottomConnector, middle3.TopConnector, _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector6); - ConnectorViewModel connector7 = new ConnectorViewModel(cobegin.BottomConnector, middle4.TopConnector); + ConnectorViewModel connector7 = new ConnectorViewModel(cobegin.BottomConnector, middle4.TopConnector, _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector7); - ConnectorViewModel connector8 = new ConnectorViewModel(middle3.BottomConnector, coend.TopConnector); + ConnectorViewModel connector8 = new ConnectorViewModel(middle3.BottomConnector, coend.TopConnector, _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector8); - ConnectorViewModel connector9 = new ConnectorViewModel(middle4.BottomConnector, coend.TopConnector); + ConnectorViewModel connector9 = new ConnectorViewModel(middle4.BottomConnector, coend.TopConnector, _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector9); - ConnectorViewModel connector10 = new ConnectorViewModel(coend.BottomConnector, end.TopConnector); + ConnectorViewModel connector10 = new ConnectorViewModel(coend.BottomConnector, end.TopConnector, _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector10); DiagramViewModel.ClearSelectedItems(); diff --git a/AIStudio.Wpf.ADiagram/ViewModels/LogicalViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/LogicalViewModel.cs index 88c3fa0..db61262 100644 --- a/AIStudio.Wpf.ADiagram/ViewModels/LogicalViewModel.cs +++ b/AIStudio.Wpf.ADiagram/ViewModels/LogicalViewModel.cs @@ -13,17 +13,11 @@ 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() @@ -37,6 +31,7 @@ namespace AIStudio.Wpf.Logical DiagramViewModel.CellVerticalAlignment = CellVerticalAlignment.None; DiagramViewModel.Items.CollectionChanged += Items_CollectionChanged; + _service.DrawModeViewModel.VectorLineDrawMode = DrawMode.CornerConnectingLine; } protected override void Init() @@ -79,28 +74,28 @@ namespace AIStudio.Wpf.Logical out1.LinkPoint = LogicalService.LinkPoint[4]; DiagramViewModel.DirectAddItemCommand.Execute(out1); - ConnectorViewModel connector1 = new ConnectorViewModel(in1.Output[0], item1.Input[0]); + ConnectorViewModel connector1 = new ConnectorViewModel(in1.Output[0], item1.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector1); - ConnectorViewModel connector2 = new ConnectorViewModel(in2.Output[0], item1.Input[1]); + ConnectorViewModel connector2 = new ConnectorViewModel(in2.Output[0], item1.Input[1], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector2); - ConnectorViewModel connector3 = new ConnectorViewModel(item1.Output[0], gTGate.Input[0]); + ConnectorViewModel connector3 = new ConnectorViewModel(item1.Output[0], gTGate.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector3); - ConnectorViewModel connector4 = new ConnectorViewModel(constant.Output[0], gTGate.Input[1]); + ConnectorViewModel connector4 = new ConnectorViewModel(constant.Output[0], gTGate.Input[1], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector4); - ConnectorViewModel connector5 = new ConnectorViewModel(gTGate.Output[0], sELGate.Input[0]); + ConnectorViewModel connector5 = new ConnectorViewModel(gTGate.Output[0], sELGate.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector5); - ConnectorViewModel connector6 = new ConnectorViewModel(in3.Output[0], sELGate.Input[1]); + ConnectorViewModel connector6 = new ConnectorViewModel(in3.Output[0], sELGate.Input[1], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector6); - ConnectorViewModel connector7 = new ConnectorViewModel(in4.Output[0], sELGate.Input[2]); + ConnectorViewModel connector7 = new ConnectorViewModel(in4.Output[0], sELGate.Input[2], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector7); - ConnectorViewModel connector8 = new ConnectorViewModel(sELGate.Output[0], out1.Input[0]); + ConnectorViewModel connector8 = new ConnectorViewModel(sELGate.Output[0], out1.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector8); } diff --git a/AIStudio.Wpf.ADiagram/ViewModels/SFCViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/SFCViewModel.cs index 6f5e900..a71a1a1 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) { @@ -32,12 +32,7 @@ namespace AIStudio.Wpf.Flowchart readDataTimer.Interval = 1000; readDataTimer.AutoReset = false; readDataTimer.Start(); - } - - protected override void OpenFile(DiagramDocument diagramDocument) - { _service.DrawModeViewModel.VectorLineDrawMode = DrawMode.BoundaryConnectingLine; - base.OpenFile(diagramDocument); } protected override void InitDiagramViewModel() @@ -48,6 +43,7 @@ namespace AIStudio.Wpf.Flowchart DiagramViewModel.GridCellSize = new Size(100, 60); DiagramViewModel.CellHorizontalAlignment = CellHorizontalAlignment.Center; DiagramViewModel.CellVerticalAlignment = CellVerticalAlignment.Center; + _service.DrawModeViewModel.VectorLineDrawMode = DrawMode.BoundaryConnectingLine; } private System.Timers.Timer readDataTimer = new System.Timers.Timer(); @@ -124,79 +120,79 @@ namespace AIStudio.Wpf.Flowchart SFCCOEndNode coend = new SFCCOEndNode() { Left = 38, Top = 720, Text = "" }; DiagramViewModel.DirectAddItemCommand.Execute(coend); - ConnectorViewModel connector1_1 = new ConnectorViewModel(start.Output[0], condition1_1.Input[0]); + ConnectorViewModel connector1_1 = new ConnectorViewModel(start.Output[0], condition1_1.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector1_1); - ConnectorViewModel connector2_1 = new ConnectorViewModel(condition1_1.Output[0], step1.Input[0]); + ConnectorViewModel connector2_1 = new ConnectorViewModel(condition1_1.Output[0], step1.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector2_1); - ConnectorViewModel connector1_2 = new ConnectorViewModel(start.Output[0], condition1_2.Input[0]); + ConnectorViewModel connector1_2 = new ConnectorViewModel(start.Output[0], condition1_2.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector1_2); - ConnectorViewModel connector2_2 = new ConnectorViewModel(condition1_2.Output[0], step1.Input[0]); + ConnectorViewModel connector2_2 = new ConnectorViewModel(condition1_2.Output[0], step1.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector2_2); - ConnectorViewModel connector31 = new ConnectorViewModel(step1.Action[0], action11.Input[0]); + ConnectorViewModel connector31 = new ConnectorViewModel(step1.Action[0], action11.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector31); - ConnectorViewModel connector32 = new ConnectorViewModel(step1.Action[0], action12.Input[0]); + ConnectorViewModel connector32 = new ConnectorViewModel(step1.Action[0], action12.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector32); - ConnectorViewModel connector33 = new ConnectorViewModel(step1.Action[0], action13.Input[0]); + ConnectorViewModel connector33 = new ConnectorViewModel(step1.Action[0], action13.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector33); - ConnectorViewModel connector34 = new ConnectorViewModel(step1.Action[0], action14.Input[0]); + ConnectorViewModel connector34 = new ConnectorViewModel(step1.Action[0], action14.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector34); - ConnectorViewModel connector4 = new ConnectorViewModel(step1.Output[0], condition2.Input[0]); + ConnectorViewModel connector4 = new ConnectorViewModel(step1.Output[0], condition2.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector4); - ConnectorViewModel connector5 = new ConnectorViewModel(condition2.Output[0], step2.Input[0]); + ConnectorViewModel connector5 = new ConnectorViewModel(condition2.Output[0], step2.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector5); - ConnectorViewModel connector6 = new ConnectorViewModel(step2.Action[0], action2.Input[0]); + ConnectorViewModel connector6 = new ConnectorViewModel(step2.Action[0], action2.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector6); - ConnectorViewModel connector7 = new ConnectorViewModel(step2.Output[0], condition3.Input[0]); + ConnectorViewModel connector7 = new ConnectorViewModel(step2.Output[0], condition3.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector7); - ConnectorViewModel connector8 = new ConnectorViewModel(condition3.Output[0], step3.Input[0]); + ConnectorViewModel connector8 = new ConnectorViewModel(condition3.Output[0], step3.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector8); - ConnectorViewModel connector9 = new ConnectorViewModel(step3.Action[0], action3.Input[0]); + ConnectorViewModel connector9 = new ConnectorViewModel(step3.Action[0], action3.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector9); - ConnectorViewModel connector10 = new ConnectorViewModel(step3.Output[0], condition4.Input[0]); + ConnectorViewModel connector10 = new ConnectorViewModel(step3.Output[0], condition4.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector10); - ConnectorViewModel connector11 = new ConnectorViewModel(condition4.Output[0], cobegin.Input[0]); + ConnectorViewModel connector11 = new ConnectorViewModel(condition4.Output[0], cobegin.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector11); - ConnectorViewModel connector12 = new ConnectorViewModel(cobegin.Output[0], step4.Input[0]); + ConnectorViewModel connector12 = new ConnectorViewModel(cobegin.Output[0], step4.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector12); - ConnectorViewModel connector13 = new ConnectorViewModel(step4.Action[0], action4.Input[0]); + ConnectorViewModel connector13 = new ConnectorViewModel(step4.Action[0], action4.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector13); - ConnectorViewModel connector14 = new ConnectorViewModel(step4.Output[0], condition5.Input[0]); + ConnectorViewModel connector14 = new ConnectorViewModel(step4.Output[0], condition5.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector14); - ConnectorViewModel connector15 = new ConnectorViewModel(cobegin.Output[1], step5.Input[0]); + ConnectorViewModel connector15 = new ConnectorViewModel(cobegin.Output[1], step5.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector15); - ConnectorViewModel connector16 = new ConnectorViewModel(step5.Action[0], action5.Input[0]); + ConnectorViewModel connector16 = new ConnectorViewModel(step5.Action[0], action5.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector16); - ConnectorViewModel connector17 = new ConnectorViewModel(step5.Output[0], condition6.Input[0]); + ConnectorViewModel connector17 = new ConnectorViewModel(step5.Output[0], condition6.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector17); - ConnectorViewModel connector18 = new ConnectorViewModel(condition5.Output[0], coend.Input[0]); + ConnectorViewModel connector18 = new ConnectorViewModel(condition5.Output[0], coend.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector18); - ConnectorViewModel connector19 = new ConnectorViewModel(condition6.Output[0], coend.Input[1]); + ConnectorViewModel connector19 = new ConnectorViewModel(condition6.Output[0], coend.Input[1], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector19); - ConnectorViewModel connector20 = new ConnectorViewModel(coend.Output[0], start.Input[0]); + ConnectorViewModel connector20 = new ConnectorViewModel(coend.Output[0], start.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(connector20); #region 模拟部分 @@ -249,28 +245,28 @@ namespace AIStudio.Wpf.Flowchart Simulate_TankViewModel tank3 = new Simulate_TankViewModel() { Left = 500, Top = 103, ItemWidth = 48, ItemHeight = 60, Text = "T3", LinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "T3") }; DiagramViewModel.DirectAddItemCommand.Execute(tank3); - ConnectorViewModel conn1 = new ConnectorViewModel(tank1.Output[0], k1.Input[0]); + ConnectorViewModel conn1 = new ConnectorViewModel(tank1.Output[0], k1.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(conn1); - ConnectorViewModel conn2 = new ConnectorViewModel(tank1.Output[0], k2.Input[0]); + ConnectorViewModel conn2 = new ConnectorViewModel(tank1.Output[0], k2.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(conn2); - ConnectorViewModel conn3 = new ConnectorViewModel(tank1.Output[0], k3.Input[0]); + ConnectorViewModel conn3 = new ConnectorViewModel(tank1.Output[0], k3.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(conn3); - ConnectorViewModel conn4 = new ConnectorViewModel(k1.Output[0], tank2.Input[0]); + ConnectorViewModel conn4 = new ConnectorViewModel(k1.Output[0], tank2.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(conn4); - ConnectorViewModel conn5 = new ConnectorViewModel(k2.Output[0], tank2.Input[0]); + ConnectorViewModel conn5 = new ConnectorViewModel(k2.Output[0], tank2.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(conn5); - ConnectorViewModel conn6 = new ConnectorViewModel(k3.Output[0], tank2.Input[0]); + ConnectorViewModel conn6 = new ConnectorViewModel(k3.Output[0], tank2.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(conn6); - ConnectorViewModel conn7 = new ConnectorViewModel(tank2.Output[1], k4.Input[0]); + ConnectorViewModel conn7 = new ConnectorViewModel(tank2.Output[1], k4.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(conn7); - ConnectorViewModel conn8 = new ConnectorViewModel(k4.Output[0], tank3.Input[0]); + ConnectorViewModel conn8 = new ConnectorViewModel(k4.Output[0], tank3.Input[0], _service.DrawModeViewModel.VectorLineDrawMode); DiagramViewModel.DirectAddItemCommand.Execute(conn8); #endregion diff --git a/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml b/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml index 694bf61..d57e9ce 100644 --- a/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml +++ b/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml @@ -1477,12 +1477,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Util.DiagramDesigner/Controls/DesignerCanvas.cs b/Util.DiagramDesigner/Controls/DesignerCanvas.cs index 5aa3b72..9cdfd4b 100644 --- a/Util.DiagramDesigner/Controls/DesignerCanvas.cs +++ b/Util.DiagramDesigner/Controls/DesignerCanvas.cs @@ -188,7 +188,7 @@ namespace Util.DiagramDesigner 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 ConnectorViewModel(sourceDataItem, new PartCreatedConnectionInfo(point)); + partialConnection = new ConnectorViewModel(sourceDataItem, new PartCreatedConnectionInfo(point), _service.DrawModeViewModel.VectorLineDrawMode); _viewModel.DirectAddItemCommand.Execute(partialConnection); } } @@ -209,7 +209,7 @@ namespace Util.DiagramDesigner Rect rectangleBounds = new Rect(sourceConnectorInfo.DataItem.Left, sourceConnectorInfo.DataItem.Top, 3, 3); Point point = new Point(rectangleBounds.Left + (rectangleBounds.Width / 2), rectangleBounds.Bottom + (rectangleBounds.Height / 2)); - partialConnection = new ConnectorViewModel(sourceConnectorInfo, new PartCreatedConnectionInfo(point)); + partialConnection = new ConnectorViewModel(sourceConnectorInfo, new PartCreatedConnectionInfo(point), _service.DrawModeViewModel.VectorLineDrawMode); _viewModel.DirectAddItemCommand.Execute(partialConnection); } } @@ -341,7 +341,7 @@ namespace Util.DiagramDesigner int indexOfLastTempConnection = sinkDataItem.DataItem.Parent.Items.Count - 1; sinkDataItem.DataItem.Parent.DirectRemoveItemCommand.Execute( sinkDataItem.DataItem.Parent.Items[indexOfLastTempConnection]); - sinkDataItem.DataItem.Parent.AddItemCommand.Execute(new ConnectorViewModel(sourceDataItem, sinkDataItem)); + sinkDataItem.DataItem.Parent.AddItemCommand.Execute(new ConnectorViewModel(sourceDataItem, sinkDataItem, _service.DrawModeViewModel.VectorLineDrawMode)); } else if (_service.DrawModeViewModel.GetDrawMode() == DrawMode.ConnectingLine && connectorsHit.Count() == 1) { @@ -352,7 +352,7 @@ namespace Util.DiagramDesigner _viewModel.DirectRemoveItemCommand.Execute(_viewModel.Items[indexOfLastTempConnection]); _viewModel.DirectAddItemCommand.Execute(pointItemView); - var connector = new ConnectorViewModel(sourceDataItem, sinkDataItem); + var connector = new ConnectorViewModel(sourceDataItem, sinkDataItem, _service.DrawModeViewModel.VectorLineDrawMode); _viewModel.AddItemCommand.Execute(connector); sourceDataItem.DataItem.ZIndex++; diff --git a/Util.DiagramDesigner/Converters/ConnectionDataConverter.cs b/Util.DiagramDesigner/Converters/ConnectionDataConverter.cs new file mode 100644 index 0000000..f180364 --- /dev/null +++ b/Util.DiagramDesigner/Converters/ConnectionDataConverter.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Data; +using System.Windows.Media; +using System.Windows.Media.Imaging; + +namespace Util.DiagramDesigner +{ + public class ConnectionDataConverter : IMultiValueConverter + { + static ConnectionDataConverter() + { + Instance = new ConnectionDataConverter(); + } + + public static ConnectionDataConverter Instance + { + get; + private set; + } + + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) + { + List points = (List)values[0]; + PathGeometry pathGeometry = new PathGeometry(); + PathFigure figure = new PathFigure(); + figure.StartPoint = points[0]; + if (values[1]?.ToString() == DrawMode.RadiusConnectingLine.ToString()) + { + for (var i = 0; i < points.Count - 1; i++) + { + int current = i, last = i - 1, next = i + 1, next2 = i + 2; + if (last == -1) + { + last = 0; + } + if (next == points.Count) + { + next = points.Count - 1; + } + if (next2 == points.Count) + { + next2 = points.Count - 1; + } + var bzs = SegmentHelper.GetBezierSegment(points[current], points[last], points[next], points[next2]); + figure.Segments.Add(bzs); + } + } + else + { + for (int i = 0; i < points.Count; i++) + { + + LineSegment arc = new LineSegment(points[i], true); + figure.Segments.Add(arc); + } + } + + pathGeometry.Figures.Add(figure); + return pathGeometry; + } + + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Util.DiagramDesigner/Helpers/IPathFinder.cs b/Util.DiagramDesigner/Helpers/IPathFinder.cs index 506255b..e3a0382 100644 --- a/Util.DiagramDesigner/Helpers/IPathFinder.cs +++ b/Util.DiagramDesigner/Helpers/IPathFinder.cs @@ -9,6 +9,6 @@ namespace Util.DiagramDesigner public interface IPathFinder { List GetConnectionLine(ConnectorInfo source, ConnectorInfo sink, bool showLastLine, bool sourceInnerPoint = false); - List GetConnectionLine(ConnectorInfo source, Point sinkPoint, ConnectorOrientation preferredOrientation, bool isInnerPoint = false); + List GetConnectionLine(ConnectorInfo source, Point sinkPoint, ConnectorOrientation preferredOrientation, bool showLastLine, bool isInnerPoint = false); } } diff --git a/Util.DiagramDesigner/Helpers/OrthogonalPathFinder.cs b/Util.DiagramDesigner/Helpers/OrthogonalPathFinder.cs index 231f283..15f15a3 100644 --- a/Util.DiagramDesigner/Helpers/OrthogonalPathFinder.cs +++ b/Util.DiagramDesigner/Helpers/OrthogonalPathFinder.cs @@ -56,6 +56,10 @@ namespace Util.DiagramDesigner { bool flag; Point n = GetNearestNeighborSource(source, endPoint, rectSource, rectSink, out flag, sourceInnerPoint); + if (linePoints.Contains(n)) + { + break; + } linePoints.Add(n); currentPoint = n; @@ -209,7 +213,7 @@ namespace Util.DiagramDesigner return linePoints; } - public List GetConnectionLine(ConnectorInfo source, Point sinkPoint, ConnectorOrientation preferredOrientation, bool isInnerPoint = false) + public List GetConnectionLine(ConnectorInfo source, Point sinkPoint, ConnectorOrientation preferredOrientation, bool showLastLine, bool isInnerPoint = false) { List linePoints = new List(); int margin = isInnerPoint ? 0 : const_margin; @@ -265,7 +269,7 @@ namespace Util.DiagramDesigner else linePoints = OptimizeLinePoints(linePoints, new Rect[] { rectSource }, source.Orientation, GetOpositeOrientation(source.Orientation)); - if (!isInnerPoint) + if (!showLastLine) { linePoints.Insert(0, source.Position); } diff --git a/Util.DiagramDesigner/Helpers/SegmentHelper.cs b/Util.DiagramDesigner/Helpers/SegmentHelper.cs new file mode 100644 index 0000000..b05b0c5 --- /dev/null +++ b/Util.DiagramDesigner/Helpers/SegmentHelper.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; +using System.Windows.Media; + +namespace Util.DiagramDesigner +{ + public class SegmentHelper + { + /// + /// 获得贝塞尔曲线 + /// + /// 当前点 + /// 上一个点 + /// 下一个点1 + /// 下一个点2 + /// + public static BezierSegment GetBezierSegment(Point currentPt, Point lastPt, Point nextPt1, Point nextPt2) + { + //计算中点 + var lastC = GetCenterPoint(lastPt, currentPt); + var nextC1 = GetCenterPoint(currentPt, nextPt1); //贝塞尔控制点 + var nextC2 = GetCenterPoint(nextPt1, nextPt2); + + //计算相邻中点连线跟目的点的垂足 + //效果并不算太好,因为可能点在两个线上或者线的延长线上,计算会有误差 + //所以就直接使用中点平移方法。 + //var C1 = GetFootPoint(lastC, nextC1, currentPt); + //var C2 = GetFootPoint(nextC1, nextC2, nextPt1); + + + //计算“相邻中点”的中点 + var c1 = GetCenterPoint(lastC, nextC1); + var c2 = GetCenterPoint(nextC1, nextC2); + + + //计算【"中点"的中点】需要的点位移 + var controlPtOffset1 = currentPt - c1; + var controlPtOffset2 = nextPt1 - c2; + + //移动控制点 + var controlPt1 = nextC1 + controlPtOffset1; + var controlPt2 = nextC1 + controlPtOffset2; + + //如果觉得曲线幅度太大,可以将控制点向当前点靠近一定的系数。 + controlPt1 = controlPt1 + 0 * (currentPt - controlPt1); + controlPt2 = controlPt2 + 0 * (nextPt1 - controlPt2); + + var bzs = new BezierSegment(controlPt1, controlPt2, nextPt1, true); + return bzs; + } + + /// + /// 过c点做A和B连线的垂足 + /// + /// + /// + /// + /// + private static Point GetFootPoint(Point aPoint, Point bPoint, Point cPoint) + { + //设三点坐标是A,B,C,AB构成直线,C是线外的点 + //三点对边距离是a,b,c,垂足为D, + //根据距离推导公式得:AD距离是(b平方-a平方+c平方)/2c + //本人数学不好,可能没考虑点c在线ab上的情况 + var offsetADist = (Math.Pow(cPoint.X - aPoint.X, 2) + Math.Pow(cPoint.Y - aPoint.Y, 2) - Math.Pow(bPoint.X - cPoint.X, 2) - Math.Pow(bPoint.Y - cPoint.Y, 2) + Math.Pow(aPoint.X - bPoint.X, 2) + Math.Pow(aPoint.Y - bPoint.Y, 2)) / (2 * GetDistance(aPoint, bPoint)); + + var v = bPoint - aPoint; + var distab = GetDistance(aPoint, bPoint); + var offsetVector = v * offsetADist / distab; + return aPoint + offsetVector; + } + + private static Point GetCenterPoint(Point pt1, Point pt2) + { + return new Point((pt1.X + pt2.X) / 2, (pt1.Y + pt2.Y) / 2); + } + + private static double GetDistance(Point pt1, Point pt2) + { + return Math.Sqrt(Math.Pow(pt1.X - pt2.X, 2) + Math.Pow(pt1.Y - pt2.Y, 2)); + } + } +} diff --git a/Util.DiagramDesigner/Models/ConnectionItem.cs b/Util.DiagramDesigner/Models/ConnectionItem.cs index 580cd4c..a1e0485 100644 --- a/Util.DiagramDesigner/Models/ConnectionItem.cs +++ b/Util.DiagramDesigner/Models/ConnectionItem.cs @@ -17,26 +17,27 @@ namespace Util.DiagramDesigner { } - public ConnectionItem(Guid id, Guid sourceId, ConnectorOrientation sourceOrientation, Type sourceType, double sourceXRatio, double sourceYRatio, bool sourceInnerPoint, - Guid sinkId, ConnectorOrientation sinkOrientation, Type sinkType, double sinkXRatio, double sinkYRatio, bool sinkInnerPoint, - int zIndex, bool isGroup, Guid parentId, ColorViewModel colorViewModel, FontViewModel fontViewModel) : base(id, zIndex, isGroup, parentId, colorViewModel, fontViewModel) - { - this.SourceId = sourceId; - this.SourceOrientation = sourceOrientation; - this.SourceType = sourceType; - this.SourceTypeName = sourceType.FullName; - this.SourceXRatio = sourceXRatio; - this.SourceYRatio = sourceYRatio; - this.SourceInnerPoint = sourceInnerPoint; + //public ConnectionItem(Guid id, Guid sourceId, ConnectorOrientation sourceOrientation, Type sourceType, double sourceXRatio, double sourceYRatio, bool sourceInnerPoint, + // Guid sinkId, ConnectorOrientation sinkOrientation, Type sinkType, double sinkXRatio, double sinkYRatio, bool sinkInnerPoint, + // int zIndex, bool isGroup, Guid parentId, DrawMode vectorLineDrawMode, ColorViewModel colorViewModel, FontViewModel fontViewModel) : base(id, zIndex, isGroup, parentId, colorViewModel, fontViewModel) + //{ + // this.SourceId = sourceId; + // this.SourceOrientation = sourceOrientation; + // this.SourceType = sourceType; + // this.SourceTypeName = sourceType.FullName; + // this.SourceXRatio = sourceXRatio; + // this.SourceYRatio = sourceYRatio; + // this.SourceInnerPoint = sourceInnerPoint; - this.SinkId = sinkId; - this.SinkOrientation = sinkOrientation; - this.SinkType = sinkType; - this.SinkTypeName = sinkType.FullName; - this.SinkXRatio = sinkXRatio; - this.SinkYRatio = sinkYRatio; - this.SinkInnerPoint = sinkInnerPoint; - } + // this.SinkId = sinkId; + // this.SinkOrientation = sinkOrientation; + // this.SinkType = sinkType; + // this.SinkTypeName = sinkType.FullName; + // this.SinkXRatio = sinkXRatio; + // this.SinkYRatio = sinkYRatio; + // this.SinkInnerPoint = sinkInnerPoint; + // this.VectorLineDrawMode = vectorLineDrawMode; + //} public ConnectionItem(Guid sourceId, ConnectorOrientation sourceOrientation, Type sourceType, double sourceXRatio, double sourceYRatio, bool sourceInnerPoint, Guid sinkId, ConnectorOrientation sinkOrientation, Type sinkType, double sinkXRatio, double sinkYRatio, bool sinkInnerPoint, ConnectorViewModel viewmodel) : base(viewmodel) @@ -56,6 +57,7 @@ namespace Util.DiagramDesigner this.SinkXRatio = sinkXRatio; this.SinkYRatio = sinkYRatio; this.SinkInnerPoint = sinkInnerPoint; + this.VectorLineDrawMode = viewmodel.VectorLineDrawMode; } [XmlAttribute] @@ -99,5 +101,8 @@ namespace Util.DiagramDesigner [XmlAttribute] public bool SinkInnerPoint { get; set; } + + [XmlAttribute] + public DrawMode VectorLineDrawMode { get; set; } } } diff --git a/Util.DiagramDesigner/Models/SelectableDesignerItemBase.cs b/Util.DiagramDesigner/Models/SelectableDesignerItemBase.cs index f8a5909..eca49b8 100644 --- a/Util.DiagramDesigner/Models/SelectableDesignerItemBase.cs +++ b/Util.DiagramDesigner/Models/SelectableDesignerItemBase.cs @@ -21,17 +21,17 @@ namespace Util.DiagramDesigner FontItem = new FontItem(); } - public SelectableDesignerItemBase(Guid id, int zIndex, bool isGroup, Guid parentId, IColorViewModel colorViewModel, IFontViewModel fontViewModel) - { - this.Id = id; - this.ZIndex = zIndex; - this.IsGroup = isGroup; - this.ParentId = parentId; + //public SelectableDesignerItemBase(Guid id, int zIndex, bool isGroup, Guid parentId, IColorViewModel colorViewModel, IFontViewModel fontViewModel) + //{ + // this.Id = id; + // this.ZIndex = zIndex; + // this.IsGroup = isGroup; + // this.ParentId = parentId; - ColorItem = CopyHelper.Mapper(colorViewModel); - FontItem = CopyHelper.Mapper(fontViewModel); - } + // ColorItem = CopyHelper.Mapper(colorViewModel); + // FontItem = CopyHelper.Mapper(fontViewModel); + //} public SelectableDesignerItemBase(SelectableDesignerItemViewModelBase viewmodel) { diff --git a/Util.DiagramDesigner/UserControls/DiagramControl.xaml b/Util.DiagramDesigner/UserControls/DiagramControl.xaml index 7185ab5..e2f45a6 100644 --- a/Util.DiagramDesigner/UserControls/DiagramControl.xaml +++ b/Util.DiagramDesigner/UserControls/DiagramControl.xaml @@ -540,12 +540,21 @@ - - + StrokeDashArray="{Binding ColorViewModel.LineDashStyle,Converter={StaticResource LineDashConverter}}" />--> + + + + + + + +