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, IRecipient { private List allConfigs; [ObservableProperty] private List configs; private ICollectionView cv; /// /// 配置文件路径 /// 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(this, "manager"); WeakReferenceMessenger.Default.Register(this, "config"); try { EnsureConfigFileExists(); //读取配置文件 var jsonString = File.ReadAllText(path); allConfigs = JsonConvert.DeserializeObject>(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(); } /// /// 确保配置文件存在,如果不存在则创建 /// 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")); } /// /// 接收新的配置列表 /// /// public void Receive(string message) { //allConfigs = new List(message); //Configs = allConfigs.Where(s => s.ComponentType == SelectedComponentType).ToList(); var jsonString = File.ReadAllText(path); allConfigs = JsonConvert.DeserializeObject>(jsonString) .Where(s => s.IsEnabled) .ToList(); Configs = allConfigs.Where(s => s.ComponentType == SelectedComponentType).ToList(); SelectedConfig = Configs.FirstOrDefault(); } /// /// 修改当前模板的配置接收 /// /// 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>(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)); } } } }