序列化继续改进

This commit is contained in:
艾竹
2023-01-25 11:11:27 +08:00
parent a5005ac083
commit a01eb8825a
44 changed files with 319 additions and 398 deletions

View File

@@ -42,14 +42,16 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
public DiagramsViewModel(string filename)
{
FileName = filename;
var diagramDocument = OpenFile(filename);
OpenFile(diagramDocument);
string ext = Path.GetExtension(filename);
var diagramDocument = OpenFile(filename, ext);
OpenFile(diagramDocument, ext);
}
public DiagramsViewModel(string filename, DiagramDocument diagramDocument)
{
FileName = filename;
OpenFile(diagramDocument);
string ext = Path.GetExtension(filename);
OpenFile(diagramDocument, ext);
}
protected virtual void InitDiagramViewModel()
@@ -159,7 +161,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
{
if (e.PropertyName == "IsSelected")
{
_service.SelectedItem = DiagramViewModel.SelectedItems?.FirstOrDefault();
_service.SelectedItem = DiagramViewModel?.SelectedItems?.FirstOrDefault();
}
var property = sender.GetType().GetProperty(e.PropertyName);
@@ -179,13 +181,13 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
return true;
}
public static DiagramDocument OpenFile(string filename)
public static DiagramDocument OpenFile(string filename, string ext)
{
try
{
DiagramDocument diagramDocument = null;
if (filename.ToLower().EndsWith(".xml"))
if (ext == ".xml")
{
XmlSerializer serializer = new XmlSerializer(typeof(DiagramDocument));
FileInfo fileInfo = new FileInfo(filename);
@@ -229,7 +231,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
}
}
protected virtual void OpenFile(DiagramDocument diagramDocument)
protected virtual void OpenFile(DiagramDocument diagramDocument, string ext)
{
Title = diagramDocument.Title;
DiagramType = diagramDocument.DiagramType;
@@ -250,27 +252,29 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
viewModel.GridMarginSize = diagramItem.GridMarginSize;
viewModel.GridColor = diagramItem.GridColor;
foreach (DesignerItemBase diagramItemData in diagramItem.AllDesignerItems)
foreach (var diagramItemData in diagramItem.DesignerItems)
{
Type type = TypeHelper.GetType(diagramItemData.ItemTypeName);
DesignerItemViewModelBase itemBase = (DesignerItemViewModelBase)Activator.CreateInstance(type, viewModel, diagramItemData);
viewModel.Items.Add(itemBase);
Type type = TypeHelper.GetType(diagramItemData.ModelTypeName);
DesignerItemViewModelBase itemBase = Activator.CreateInstance(type, viewModel, diagramItemData, ext) as DesignerItemViewModelBase;
viewModel.Items.Add(itemBase);
}
foreach (var connection in diagramItem.Connections)
{
connection.SourceType = System.Type.GetType(connection.SourceTypeName);
connection.SinkType = System.Type.GetType(connection.SinkTypeName);
DesignerItemViewModelBase sourceItem = GetConnectorDataItem(viewModel, connection.SourceId, connection.SourceType);
ConnectorOrientation sourceConnectorOrientation = connection.SourceOrientation;
FullyCreatedConnectorInfo sourceConnectorInfo = GetFullConnectorInfo(connection.Id, sourceItem, sourceConnectorOrientation, connection.SourceXRatio, connection.SourceYRatio, connection.SourceInnerPoint);
Type type = TypeHelper.GetType(connection.SerializableTypeName);
var connectionItem = SerializeHelper.DeserializeObject(type, connection.SerializableString, ext) as ConnectionItem;
DesignerItemViewModelBase sinkItem = GetConnectorDataItem(viewModel, connection.SinkId, connection.SinkType);
ConnectorOrientation sinkConnectorOrientation = connection.SinkOrientation;
FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connection.Id, sinkItem, sinkConnectorOrientation, connection.SinkXRatio, connection.SinkYRatio, connection.SinkInnerPoint);
connectionItem.SourceType = System.Type.GetType(connectionItem.SourceTypeName);
connectionItem.SinkType = System.Type.GetType(connectionItem.SinkTypeName);
DesignerItemViewModelBase sourceItem = GetConnectorDataItem(viewModel, connectionItem.SourceId, connectionItem.SourceType);
ConnectorOrientation sourceConnectorOrientation = connectionItem.SourceOrientation;
FullyCreatedConnectorInfo sourceConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sourceItem, sourceConnectorOrientation, connectionItem.SourceXRatio, connectionItem.SourceYRatio, connectionItem.SourceInnerPoint);
ConnectionViewModel connectionVM = new ConnectionViewModel(viewModel, sourceConnectorInfo, sinkConnectorInfo, connection);
DesignerItemViewModelBase sinkItem = GetConnectorDataItem(viewModel, connectionItem.SinkId, connectionItem.SinkType);
ConnectorOrientation sinkConnectorOrientation = connectionItem.SinkOrientation;
FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sinkItem, sinkConnectorOrientation, connectionItem.SinkXRatio, connectionItem.SinkYRatio, connectionItem.SinkInnerPoint);
ConnectionViewModel connectionVM = new ConnectionViewModel(viewModel, sourceConnectorInfo, sinkConnectorInfo, connectionItem);
viewModel.Items.Add(connectionVM);
}
@@ -299,7 +303,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
}
}
var para = Path.GetExtension(FileName);
var ext = Path.GetExtension(FileName);
DiagramDocument diagramDocument = new DiagramDocument();
diagramDocument.DiagramItems = new List<DiagramItem>();
@@ -321,22 +325,16 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
diagramItem.GridMarginSize = viewModel.GridMarginSize;
diagramItem.GridColor = viewModel.GridColor;
diagramItem.AddItems(DiagramViewModel.Items);
var selectedDesignerItems = viewModel.Items.OfType<DesignerItemViewModelBase>();
var selectedConnections = viewModel.Items.OfType<ConnectionViewModel>();
foreach (var connectionVM in DiagramViewModel.Items.OfType<ConnectionViewModel>())
{
if (!connectionVM.IsFullConnection)
continue;
ConnectionItem connection = new ConnectionItem(connectionVM);
diagramItem.ConnectionIds.Add(connectionVM.Id);
diagramItem.Connections.Add(connection);
}
diagramItem.DesignerItems = selectedDesignerItems.Select(p => p.ToSerializableItem(ext)).Where(p => p != null).ToList();
diagramItem.Connections = selectedConnections.Select(p => p.ToSerializableItem(ext)).Where(p => p != null).ToList();
diagramDocument.DiagramItems.Add(diagramItem);
}
if (para == ".xml")
if (ext == ".xml")
{
FileInfo file = new FileInfo(FileName);
diagramDocument.Save(file);
@@ -455,7 +453,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
public void LockAction(LockObject lockObject, string propertyName)
{
foreach (var item in DiagramViewModel.SelectedItems)
foreach (var item in DiagramViewModel?.SelectedItems)
{
item.LockObjectViewModel.SetValue(lockObject);
}
@@ -496,19 +494,11 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
diagramItem.GridMarginSize = viewModel.GridMarginSize;
diagramItem.GridColor = viewModel.GridColor;
diagramItem.AddItems(DiagramViewModel.Items);
var selectedDesignerItems = viewModel.Items.OfType<DesignerItemViewModelBase>();
var selectedConnections = viewModel.Items.OfType<ConnectionViewModel>();
foreach (var connectionVM in DiagramViewModel.Items.OfType<ConnectionViewModel>())
{
if (connectionVM.IsFullConnection == false) continue;
FullyCreatedConnectorInfo sinkConnector = connectionVM.SinkConnectorInfoFully;
ConnectionItem connection = new ConnectionItem(connectionVM);
diagramItem.ConnectionIds.Add(connectionVM.Id);
diagramItem.Connections.Add(connection);
}
diagramItem.DesignerItems = selectedDesignerItems.Select(p => p.ToSerializableItem("json")).Where(p => p != null).ToList();
diagramItem.Connections = selectedConnections.Select(p => p.ToSerializableItem("json")).Where(p => p != null).ToList();
viewModel = new DiagramViewModel();
viewModel.Name = NewNameHelper.GetNewName(DiagramViewModels.Select(p => p.Name), "页-");
@@ -523,27 +513,28 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
viewModel.GridMarginSize = diagramItem.GridMarginSize;
viewModel.GridColor = diagramItem.GridColor;
foreach (DesignerItemBase diagramItemData in diagramItem.AllDesignerItems)
foreach (var diagramItemData in diagramItem.DesignerItems)
{
Type type = TypeHelper.GetType(diagramItemData.ItemTypeName);
DesignerItemViewModelBase itemBase = (DesignerItemViewModelBase)Activator.CreateInstance(type, viewModel, diagramItemData);
Type type = TypeHelper.GetType(diagramItemData.ModelTypeName);
DesignerItemViewModelBase itemBase = Activator.CreateInstance(type, viewModel, diagramItemData, "json") as DesignerItemViewModelBase;
viewModel.Items.Add(itemBase);
}
foreach (var connection in diagramItem.Connections)
{
connection.SourceType = System.Type.GetType(connection.SourceTypeName);
connection.SinkType = System.Type.GetType(connection.SinkTypeName);
DesignerItemViewModelBase sourceItem = GetConnectorDataItem(viewModel, connection.SourceId, connection.SourceType);
ConnectorOrientation sourceConnectorOrientation = connection.SourceOrientation;
FullyCreatedConnectorInfo sourceConnectorInfo = GetFullConnectorInfo(connection.Id, sourceItem, sourceConnectorOrientation, connection.SourceXRatio, connection.SourceYRatio, connection.SourceInnerPoint);
var connectionItem = JsonConvert.DeserializeObject<ConnectionItem>(connection.SerializableString);
DesignerItemViewModelBase sinkItem = GetConnectorDataItem(viewModel, connection.SinkId, connection.SinkType);
ConnectorOrientation sinkConnectorOrientation = connection.SinkOrientation;
FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connection.Id, sinkItem, sinkConnectorOrientation, connection.SinkXRatio, connection.SinkYRatio, connection.SinkInnerPoint);
connectionItem.SourceType = System.Type.GetType(connectionItem.SourceTypeName);
connectionItem.SinkType = System.Type.GetType(connectionItem.SinkTypeName);
DesignerItemViewModelBase sourceItem = GetConnectorDataItem(viewModel, connectionItem.SourceId, connectionItem.SourceType);
ConnectorOrientation sourceConnectorOrientation = connectionItem.SourceOrientation;
FullyCreatedConnectorInfo sourceConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sourceItem, sourceConnectorOrientation, connectionItem.SourceXRatio, connectionItem.SourceYRatio, connectionItem.SourceInnerPoint);
ConnectionViewModel connectionVM = new ConnectionViewModel(viewModel, sourceConnectorInfo, sinkConnectorInfo, connection);
DesignerItemViewModelBase sinkItem = GetConnectorDataItem(viewModel, connectionItem.SinkId, connectionItem.SinkType);
ConnectorOrientation sinkConnectorOrientation = connectionItem.SinkOrientation;
FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connectionItem.Id, sinkItem, sinkConnectorOrientation, connectionItem.SinkXRatio, connectionItem.SinkYRatio, connectionItem.SinkInnerPoint);
ConnectionViewModel connectionVM = new ConnectionViewModel(viewModel, sourceConnectorInfo, sinkConnectorInfo, connectionItem);
viewModel.Items.Add(connectionVM);
}
@@ -590,7 +581,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
public void AddImageExecuted(object para)
{
ImageItemViewModel itemBase = new ImageItemViewModel();
DiagramViewModel.DirectAddItemCommand.Execute(itemBase);
DiagramViewModel?.DirectAddItemCommand.Execute(itemBase);
if (itemBase.Root != null)
{
_service.DrawModeViewModel.CursorMode = CursorMode.Move;
@@ -627,7 +618,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
public void AddVideoExecuted(object para)
{
VideoItemViewModel itemBase = new VideoItemViewModel();
DiagramViewModel.DirectAddItemCommand.Execute(itemBase);
DiagramViewModel?.DirectAddItemCommand.Execute(itemBase);
if (itemBase.Root != null)
{
_service.DrawModeViewModel.CursorMode = CursorMode.Move;
@@ -637,7 +628,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
public void AddOutLineTextExecuted(object para)
{
OutLineTextDesignerItemViewModel itemBase = new OutLineTextDesignerItemViewModel();
DiagramViewModel.DirectAddItemCommand.Execute(itemBase);
DiagramViewModel?.DirectAddItemCommand.Execute(itemBase);
if (itemBase.Root != null)
{
_service.DrawModeViewModel.CursorMode = CursorMode.Move;
@@ -647,7 +638,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
public void AddBarcodeExecuted(object para)
{
BarcodeDesignerItemViewModel itemBase = new BarcodeDesignerItemViewModel() { Format = (BarcodeFormat)Enum.Parse(typeof(BarcodeFormat), para.ToString()), Text="AIStudio.Wpf.DiagramApp" };
DiagramViewModel.DirectAddItemCommand.Execute(itemBase);
DiagramViewModel?.DirectAddItemCommand.Execute(itemBase);
if (itemBase.Root != null)
{
_service.DrawModeViewModel.CursorMode = CursorMode.Move;