268 lines
10 KiB
C#
268 lines
10 KiB
C#
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Collections.ObjectModel;
|
|||
|
|
using System.ComponentModel;
|
|||
|
|
using System.Configuration;
|
|||
|
|
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Reflection;
|
|||
|
|
using System.Windows;
|
|||
|
|
using System.Windows.Data;
|
|||
|
|
|
|||
|
|
using Bentley.DgnPlatformNET;
|
|||
|
|
using Bentley.ECObjects.Instance;
|
|||
|
|
using Bentley.MstnPlatformNET;
|
|||
|
|
|
|||
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|||
|
|
using CommunityToolkit.Mvvm.Input;
|
|||
|
|
using CommunityToolkit.Mvvm.Messaging;
|
|||
|
|
|
|||
|
|
using Newtonsoft.Json;
|
|||
|
|
using Newtonsoft.Json.Linq;
|
|||
|
|
|
|||
|
|
using QuickModeling.Models;
|
|||
|
|
using QuickModeling.Views;
|
|||
|
|
|
|||
|
|
namespace QuickModeling.ViewModels
|
|||
|
|
{
|
|||
|
|
public partial class ConfigurationPropsAttachViewModel : ObservableRecipient, IRecipient<string>, IRecipient<ComponentConfig>
|
|||
|
|
{
|
|||
|
|
private List<ComponentConfig> allConfigs;
|
|||
|
|
|
|||
|
|
[ObservableProperty]
|
|||
|
|
private List<ComponentConfig> configs;
|
|||
|
|
private ICollectionView cv;
|
|||
|
|
/// <summary>
|
|||
|
|
/// 配置文件路径
|
|||
|
|
/// </summary>
|
|||
|
|
private readonly string path = Path.Combine(
|
|||
|
|
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
|
|||
|
|
"Configs",
|
|||
|
|
"Configurations.json");
|
|||
|
|
[ObservableProperty]
|
|||
|
|
private ComponentType selectedComponentType;
|
|||
|
|
[ObservableProperty]
|
|||
|
|
[NotifyCanExecuteChangedFor(nameof(ModifyConfigCommand), nameof(AddToModelsCommand))]
|
|||
|
|
private ComponentConfig selectedConfig;
|
|||
|
|
|
|||
|
|
public ConfigurationPropsAttachViewModel()
|
|||
|
|
{
|
|||
|
|
WeakReferenceMessenger.Default.Register<string, string>(this, "manager");
|
|||
|
|
WeakReferenceMessenger.Default.Register<ComponentConfig, string>(this, "config");
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
EnsureConfigFileExists();
|
|||
|
|
//读取配置文件
|
|||
|
|
var jsonString = File.ReadAllText(path);
|
|||
|
|
allConfigs = JsonConvert.DeserializeObject<List<ComponentConfig>>(jsonString)
|
|||
|
|
.Where(s => s.IsEnabled)
|
|||
|
|
.ToList();
|
|||
|
|
Configs = allConfigs.Where(s => s.ComponentType == SelectedComponentType).ToList();
|
|||
|
|
}
|
|||
|
|
catch (System.Exception ex)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(ex.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[RelayCommand(CanExecute = nameof(CanOperate))]
|
|||
|
|
private void AddToModels(ComponentConfig config)
|
|||
|
|
{
|
|||
|
|
if (config == null)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show("请选择要添加的配置", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
//选中参数
|
|||
|
|
var agenda = new ElementAgenda();
|
|||
|
|
SelectionSetManager.BuildAgenda(ref agenda);
|
|||
|
|
if (agenda.IsEmpty)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show("请先选择要添加属性的元素", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
//var lib = ItemTypesHelpers.GetOrCreateItemTypeLibrary(config.Name);
|
|||
|
|
//ItemType分组
|
|||
|
|
var groups = config.Parameters.GroupBy(p => p.Group);
|
|||
|
|
//var itemTypes = lib.ItemTypes;
|
|||
|
|
//将ItemType添加到ItemTypeLibrary中,即dgnfile中
|
|||
|
|
foreach (var g in groups)
|
|||
|
|
{
|
|||
|
|
var itemType = ItemTypesHelpers.GetOrCreateItemType(config.Name, g.Key);
|
|||
|
|
foreach (var p in g)
|
|||
|
|
{
|
|||
|
|
//存在参数,则不加
|
|||
|
|
var prop = itemType.GetPropertyByName(p.Name);
|
|||
|
|
if (prop == null)
|
|||
|
|
{
|
|||
|
|
ItemTypesHelpers.AddPropertyToItemType(
|
|||
|
|
itemType,
|
|||
|
|
p.Name,
|
|||
|
|
(CustomProperty.TypeKind)p.DataType,
|
|||
|
|
p.Value);
|
|||
|
|
}
|
|||
|
|
else//更新属性定义
|
|||
|
|
{
|
|||
|
|
prop.Type = (CustomProperty.TypeKind)p.DataType;
|
|||
|
|
prop.DefaultValue = p.Value;
|
|||
|
|
itemType.Library.Write();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//lib.AddItemType(itemType.Name);
|
|||
|
|
}
|
|||
|
|
//ItemType添加到模型中
|
|||
|
|
//var dgnFile = Session.Instance.GetActiveDgnFile();
|
|||
|
|
|
|||
|
|
foreach (var g in groups)
|
|||
|
|
{
|
|||
|
|
//ItemTypesHelpers.AttachItemTypeToElement(libName, g.Key);
|
|||
|
|
for (uint i = 0; i < agenda.GetCount(); i++)
|
|||
|
|
{
|
|||
|
|
var element = agenda.GetEntry(i);
|
|||
|
|
|
|||
|
|
//ItemType添加到元素
|
|||
|
|
var ecIns = ItemTypesHelpers.AttachItemTypeToElement(element, config.Name, g.Key);
|
|||
|
|
foreach (var param in g)
|
|||
|
|
{
|
|||
|
|
string valueStr = param.Value?.ToString();
|
|||
|
|
|
|||
|
|
switch (param.DataType)
|
|||
|
|
{
|
|||
|
|
case TypeKind.Boolean:
|
|||
|
|
if (bool.TryParse(valueStr, out bool boolValue))
|
|||
|
|
ecIns.SetBoolean(param.Name, boolValue);
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case TypeKind.Double:
|
|||
|
|
if (double.TryParse(valueStr, out double doubleValue))
|
|||
|
|
ecIns.SetDouble(param.Name, doubleValue);
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case TypeKind.Integer:
|
|||
|
|
if (int.TryParse(valueStr, out int intValue))
|
|||
|
|
ecIns.SetInteger(param.Name, intValue);
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case TypeKind.String:
|
|||
|
|
ecIns.SetString(param.Name, valueStr ?? string.Empty);
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
// 可记录日志或抛出异常
|
|||
|
|
System.Diagnostics.Debug.WriteLine($"不支持的参数值类型: {param.DataType}");
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
ecIns.WriteChanges();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (System.Exception ex)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show($"添加配置到模型时发生错误:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private bool CanOperate(ComponentConfig config) => SelectedConfig != null;
|
|||
|
|
|
|||
|
|
[RelayCommand]
|
|||
|
|
private void ConfigManager()
|
|||
|
|
{
|
|||
|
|
ConfigurationManagerViewModel configManagerViewModel = new ConfigurationManagerViewModel();
|
|||
|
|
ConfigurationsManagerView view = new() { DataContext = configManagerViewModel };
|
|||
|
|
view.ShowDialog();
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 确保配置文件存在,如果不存在则创建
|
|||
|
|
/// </summary>
|
|||
|
|
private void EnsureConfigFileExists()
|
|||
|
|
{
|
|||
|
|
var dir = Path.GetDirectoryName(path);
|
|||
|
|
if (Directory.Exists(dir))
|
|||
|
|
{
|
|||
|
|
Directory.CreateDirectory(dir);
|
|||
|
|
}
|
|||
|
|
if (!File.Exists(path))
|
|||
|
|
{
|
|||
|
|
File.Create(path).Close();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[RelayCommand(CanExecute = nameof(CanOperate))]
|
|||
|
|
private void ModifyConfig(ComponentConfig config)
|
|||
|
|
{
|
|||
|
|
if (config != null)
|
|||
|
|
{
|
|||
|
|
var copy = config.Clone() as ComponentConfig;
|
|||
|
|
copy.Guid = config.Guid;
|
|||
|
|
var configViewModel = new ConfigurationViewModel(copy);
|
|||
|
|
|
|||
|
|
var configurationView = new ConfigurationView
|
|||
|
|
{
|
|||
|
|
DataContext = configViewModel
|
|||
|
|
};
|
|||
|
|
configurationView.ShowDialog();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
partial void OnSelectedComponentTypeChanged(ComponentType value)
|
|||
|
|
{ Configs = allConfigs.Where(s => s.ComponentType == value).ToList(); }
|
|||
|
|
|
|||
|
|
partial void OnSelectedConfigChanged(ComponentConfig value)
|
|||
|
|
{
|
|||
|
|
if (value == null)
|
|||
|
|
return;
|
|||
|
|
cv = CollectionViewSource.GetDefaultView(value.Parameters);
|
|||
|
|
cv.GroupDescriptions.Clear();
|
|||
|
|
cv.GroupDescriptions.Add(new PropertyGroupDescription("Group"));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 接收新的配置列表
|
|||
|
|
/// </summary>
|
|||
|
|
/// <g name="message"></g>
|
|||
|
|
public void Receive(string message)
|
|||
|
|
{
|
|||
|
|
//allConfigs = new List<ComponentConfig>(message);
|
|||
|
|
//Configs = allConfigs.Where(s => s.ComponentType == SelectedComponentType).ToList();
|
|||
|
|
var jsonString = File.ReadAllText(path);
|
|||
|
|
allConfigs = JsonConvert.DeserializeObject<List<ComponentConfig>>(jsonString)
|
|||
|
|
.Where(s => s.IsEnabled)
|
|||
|
|
.ToList();
|
|||
|
|
Configs = allConfigs.Where(s => s.ComponentType == SelectedComponentType).ToList();
|
|||
|
|
SelectedConfig = Configs.FirstOrDefault();
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 修改当前模板的配置接收
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="message"></param>
|
|||
|
|
public void Receive(ComponentConfig message)
|
|||
|
|
{
|
|||
|
|
var existCofig = allConfigs.Where(c => c.Guid == message.Guid).FirstOrDefault();
|
|||
|
|
//接收返回的配置,如果存在则更新,否则添加新的配置
|
|||
|
|
if (existCofig != null)
|
|||
|
|
{
|
|||
|
|
var index = allConfigs.IndexOf(existCofig);
|
|||
|
|
allConfigs[index] = message;
|
|||
|
|
var jsonStr = JsonConvert.SerializeObject(allConfigs, Formatting.Indented);
|
|||
|
|
EnsureConfigFileExists();
|
|||
|
|
File.WriteAllText(path, jsonStr);
|
|||
|
|
|
|||
|
|
//更新配置列表
|
|||
|
|
var jsonString = File.ReadAllText(path);
|
|||
|
|
allConfigs = JsonConvert.DeserializeObject<List<ComponentConfig>>(jsonString)
|
|||
|
|
.Where(s => s.IsEnabled)
|
|||
|
|
.ToList();
|
|||
|
|
SelectedComponentType = message.ComponentType;
|
|||
|
|
Configs = allConfigs.Where(s => s.ComponentType == SelectedComponentType).ToList();
|
|||
|
|
SelectedConfig = Configs.FirstOrDefault(c => c.Guid == message.Guid);
|
|||
|
|
//Configs.Remove(existCofig);
|
|||
|
|
//Configs.Insert(index, message);
|
|||
|
|
//.ToList().ForEach(c => Configs.Remove(c));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|