From bd90d55ca85519bdd1b8ff103e579c42f7cf00bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=89=BE=E7=AB=B9?= Date: Fri, 3 Feb 2023 22:25:03 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=84=E5=90=88=E5=AF=B9=E8=B1=A1=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...athToolBoxData.cs => CustomToolBoxData.cs} | 74 ++++++++----------- AIStudio.Wpf.DiagramApp/Models/DiagramItem.cs | 3 + .../ViewModels/ToolBoxViewModel.cs | 3 +- .../Views/ToolBoxControl.xaml | 8 +- .../Controls/DesignerCanvas.cs | 5 +- .../Serializables/SerializableObject.cs | 41 ++++++++++ .../SelectableDesignerItemViewModelBase.cs | 2 + 7 files changed, 88 insertions(+), 48 deletions(-) rename AIStudio.Wpf.DiagramApp/Models/{PathToolBoxData.cs => CustomToolBoxData.cs} (50%) diff --git a/AIStudio.Wpf.DiagramApp/Models/PathToolBoxData.cs b/AIStudio.Wpf.DiagramApp/Models/CustomToolBoxData.cs similarity index 50% rename from AIStudio.Wpf.DiagramApp/Models/PathToolBoxData.cs rename to AIStudio.Wpf.DiagramApp/Models/CustomToolBoxData.cs index 6223ab8..a8a8b0f 100644 --- a/AIStudio.Wpf.DiagramApp/Models/PathToolBoxData.cs +++ b/AIStudio.Wpf.DiagramApp/Models/CustomToolBoxData.cs @@ -49,8 +49,14 @@ namespace AIStudio.Wpf.DiagramApp.Models public class DesignerItemToolBoxData : ToolBoxData { - public string FileName { get; set; } - public DesignerItemViewModelBase DesignerItemViewModel { get; set; } + public string FileName + { + get; set; + } + public DesignerItemViewModelBase DesignerItemViewModel + { + get; set; + } public DesignerItemToolBoxData(DesignerItemBase designerItemBase, string filename, Type type, double width = 32, double height = 32, Size? desiredSize = null, string description = null) : base(null, null, type, width, height, desiredSize, description) { Addition = designerItemBase; @@ -66,58 +72,40 @@ namespace AIStudio.Wpf.DiagramApp.Models { get; set; } - public List SelectableDesignerItemViewModel + public List SelectableDesignerItemViewModels { get; set; } - public MultipleDesignerItemToolBoxData(DiagramItem designerItemBase, string filename, double width = 32, double height = 32, Size? desiredSize = null, string description = null) : base(null, null, typeof(List), width, height, desiredSize, description) - { - List items = new List(); - foreach (var diagramItemData in designerItemBase.DesignerItems) - { - Type itemtype = TypeHelper.GetType(diagramItemData.ModelTypeName); - DesignerItemViewModelBase itemBase = Activator.CreateInstance(itemtype, null, diagramItemData, ".json") as DesignerItemViewModelBase; - items.Add(itemBase); - } - List connects = new List(); - foreach (var connection in designerItemBase.Connections) - { - Type itemtype = TypeHelper.GetType(connection.SerializableTypeName); - var connectionItem = SerializeHelper.DeserializeObject(itemtype, connection.SerializableString, ".json") as ConnectionItem; + public double CanvasWidth + { + get; set; + } + public double CanvasHeight + { + get; set; + } + public MultipleDesignerItemToolBoxData(SerializableObject designerItemBase, string filename, double width = 32, double height = 32, Size? desiredSize = null, string description = null) : base(null, null, typeof(List), width, height, desiredSize, description) + { + SelectableDesignerItemViewModels = designerItemBase.ToObject(); - connectionItem.SourceType = System.Type.GetType(connectionItem.SourceTypeName); - connectionItem.SinkType = System.Type.GetType(connectionItem.SinkTypeName); - DesignerItemViewModelBase sourceItem = DiagramViewModelHelper.GetConnectorDataItem(items, connectionItem.SourceId, connectionItem.SourceType); - if (sourceItem == null) - continue; - ConnectorOrientation sourceConnectorOrientation = connectionItem.SourceOrientation; - FullyCreatedConnectorInfo sourceConnectorInfo = sourceItem.GetFullConnectorInfo(connectionItem.Id, sourceConnectorOrientation, connectionItem.SourceXRatio, connectionItem.SourceYRatio, connectionItem.SourceInnerPoint, connectionItem.SourceInnerPoint); + var minleft = SelectableDesignerItemViewModels.OfType().Min(p => p.Left); + var mintop = SelectableDesignerItemViewModels.OfType().Min(p => p.Top); + var maxright = SelectableDesignerItemViewModels.OfType().Max(p => p.Left + p.ItemWidth); + var maxbottom = SelectableDesignerItemViewModels.OfType().Max(p => p.Top + p.ItemHeight); - DesignerItemViewModelBase sinkItem = DiagramViewModelHelper.GetConnectorDataItem(items, connectionItem.SinkId, connectionItem.SinkType); - if (sinkItem == null) - continue; - ConnectorOrientation sinkConnectorOrientation = connectionItem.SinkOrientation; - FullyCreatedConnectorInfo sinkConnectorInfo = sinkItem.GetFullConnectorInfo(connectionItem.Id, sinkConnectorOrientation, connectionItem.SinkXRatio, connectionItem.SinkYRatio, connectionItem.SinkInnerPoint, connectionItem.SinkInnerPoint); - - ConnectionViewModel connectionVM = new ConnectionViewModel(null, sourceConnectorInfo, sinkConnectorInfo, connectionItem); - connects.Add(connectionVM); - } - - var minleft = items.OfType().Min(p => p.Left); - var mintop = items.OfType().Min(p => p.Top); - foreach (var item in items) + foreach (var item in SelectableDesignerItemViewModels.OfType()) { item.Left -= minleft; item.Top -= mintop; } + CanvasWidth = maxright - minleft; + CanvasHeight = maxbottom - mintop; - SelectableDesignerItemViewModel = new List(); - SelectableDesignerItemViewModel.AddRange(items); - SelectableDesignerItemViewModel.AddRange(connects); + designerItemBase.DesignerItems = SelectableDesignerItemViewModels.OfType().Select(p => p.ToSerializableItem(".json")).Where(p => p != null).ToList(); + designerItemBase.Connections = SelectableDesignerItemViewModels.OfType().Select(p => p.ToSerializableItem(".json")).Where(p => p != null).ToList(); - Addition = SelectableDesignerItemViewModel; + Addition = designerItemBase; FileName = filename; - } } @@ -137,5 +125,5 @@ namespace AIStudio.Wpf.DiagramApp.Models } } - + } diff --git a/AIStudio.Wpf.DiagramApp/Models/DiagramItem.cs b/AIStudio.Wpf.DiagramApp/Models/DiagramItem.cs index 3467ba8..06e14f6 100644 --- a/AIStudio.Wpf.DiagramApp/Models/DiagramItem.cs +++ b/AIStudio.Wpf.DiagramApp/Models/DiagramItem.cs @@ -18,6 +18,7 @@ using AIStudio.Wpf.SFC.ViewModels; using System.Windows; using System.Windows.Media; using AIStudio.Wpf.DiagramDesigner.Models; +using AIStudio.Wpf.DiagramDesigner.Helpers; namespace AIStudio.Wpf.DiagramApp.Models { @@ -123,5 +124,7 @@ namespace AIStudio.Wpf.DiagramApp.Models [XmlArray] public List Connections { get; set; } = new List(); + + } } diff --git a/AIStudio.Wpf.DiagramApp/ViewModels/ToolBoxViewModel.cs b/AIStudio.Wpf.DiagramApp/ViewModels/ToolBoxViewModel.cs index 81757fc..8dd88f5 100644 --- a/AIStudio.Wpf.DiagramApp/ViewModels/ToolBoxViewModel.cs +++ b/AIStudio.Wpf.DiagramApp/ViewModels/ToolBoxViewModel.cs @@ -20,6 +20,7 @@ using AIStudio.Wpf.Flowchart.Models; using AIStudio.Wpf.SFC.Models; using System.Windows; using System; +using AIStudio.Wpf.DiagramDesigner.Models; namespace AIStudio.Wpf.DiagramApp.ViewModels { @@ -272,7 +273,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels if (xmlobject.DiagramItems[0].DesignerItems.Count > 1) { - var itemBase = new MultipleDesignerItemToolBoxData(xmlobject.DiagramItems[0], filename); + var itemBase = new MultipleDesignerItemToolBoxData(new SerializableObject() { DesignerItems = xmlobject.DiagramItems[0].DesignerItems, Connections = xmlobject.DiagramItems[0].Connections }, filename); return itemBase; } diff --git a/AIStudio.Wpf.DiagramApp/Views/ToolBoxControl.xaml b/AIStudio.Wpf.DiagramApp/Views/ToolBoxControl.xaml index e6f3205..1364a67 100644 --- a/AIStudio.Wpf.DiagramApp/Views/ToolBoxControl.xaml +++ b/AIStudio.Wpf.DiagramApp/Views/ToolBoxControl.xaml @@ -162,7 +162,7 @@ - + @@ -173,8 +173,10 @@ StrokeDashArray="2" Fill="Transparent" SnapsToDevicePixels="true"/> - - + + diff --git a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs index a891007..cc4482f 100644 --- a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs +++ b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs @@ -12,6 +12,8 @@ using System.Linq; using System.Windows.Shapes; using System.Windows.Resources; using System.Runtime.InteropServices; +using Newtonsoft.Json; +using AIStudio.Wpf.DiagramDesigner.Models; namespace AIStudio.Wpf.DiagramDesigner { @@ -567,8 +569,9 @@ namespace AIStudio.Wpf.DiagramDesigner { _viewModel.ClearSelectedItemsCommand.Execute(null); Point position = e.GetPosition(this); - if (dragObject.DesignerItem is List designerItems) + if (dragObject.DesignerItem is SerializableObject serializableObject) { + var designerItems = serializableObject.ToObject(); foreach (var item in designerItems.OfType()) { item.Left += position.X; diff --git a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/SerializableObject.cs b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/SerializableObject.cs index 7e6fb9d..781f963 100644 --- a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/SerializableObject.cs +++ b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/SerializableObject.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text; using System.Xml.Serialization; +using AIStudio.Wpf.DiagramDesigner.Helpers; namespace AIStudio.Wpf.DiagramDesigner.Models { @@ -49,5 +50,45 @@ namespace AIStudio.Wpf.DiagramDesigner.Models [XmlArray] public List Connections { get; set; } = new List(); + + public List ToObject() + { + List items = new List(); + foreach (var diagramItemData in this.DesignerItems) + { + Type itemtype = TypeHelper.GetType(diagramItemData.ModelTypeName); + DesignerItemViewModelBase itemBase = Activator.CreateInstance(itemtype, null, diagramItemData, ".json") as DesignerItemViewModelBase; + items.Add(itemBase); + } + List connects = new List(); + foreach (var connection in this.Connections) + { + Type itemtype = TypeHelper.GetType(connection.SerializableTypeName); + var connectionItem = SerializeHelper.DeserializeObject(itemtype, connection.SerializableString, ".json") as ConnectionItem; + + connectionItem.SourceType = System.Type.GetType(connectionItem.SourceTypeName); + connectionItem.SinkType = System.Type.GetType(connectionItem.SinkTypeName); + DesignerItemViewModelBase sourceItem = DiagramViewModelHelper.GetConnectorDataItem(items, connectionItem.SourceId, connectionItem.SourceType); + if (sourceItem == null) + continue; + ConnectorOrientation sourceConnectorOrientation = connectionItem.SourceOrientation; + FullyCreatedConnectorInfo sourceConnectorInfo = sourceItem.GetFullConnectorInfo(connectionItem.Id, sourceConnectorOrientation, connectionItem.SourceXRatio, connectionItem.SourceYRatio, connectionItem.SourceInnerPoint, connectionItem.SourceInnerPoint); + + DesignerItemViewModelBase sinkItem = DiagramViewModelHelper.GetConnectorDataItem(items, connectionItem.SinkId, connectionItem.SinkType); + if (sinkItem == null) + continue; + ConnectorOrientation sinkConnectorOrientation = connectionItem.SinkOrientation; + FullyCreatedConnectorInfo sinkConnectorInfo = sinkItem.GetFullConnectorInfo(connectionItem.Id, sinkConnectorOrientation, connectionItem.SinkXRatio, connectionItem.SinkYRatio, connectionItem.SinkInnerPoint, connectionItem.SinkInnerPoint); + + ConnectionViewModel connectionVM = new ConnectionViewModel(null, sourceConnectorInfo, sinkConnectorInfo, connectionItem); + connects.Add(connectionVM); + } + + var viewmodels = new List(); + viewmodels.AddRange(items); + viewmodels.AddRange(connects); + + return viewmodels; + } } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableDesignerItemViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableDesignerItemViewModelBase.cs index f5ce8c3..8f79a83 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableDesignerItemViewModelBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableDesignerItemViewModelBase.cs @@ -159,5 +159,7 @@ namespace AIStudio.Wpf.DiagramDesigner ShowText = true; } + + } }